Ethereum Sending.send requests in loop仅设置循环i的最后一个值的次数

Ethereum Sending.send requests in loop仅设置循环i的最后一个值的次数,ethereum,web3,web3js,metamask,Ethereum,Web3,Web3js,Metamask,我知道这不是智能合约的问题,因为我在混音和单独的国家推动下彻底测试了它。我使用web3和Metamask 合同中的所有值都设置为“test4”我找到了解决此问题的黑客解决方案,并在web3 github上创建了一个问题 请在此处查看我的问题和解决方案: 我找不到一个简洁的解决方案,但我确信一旦发现问题,就会出现一个解决方案。在背靠背发送多个事务时,您必须为每个事务设置nonce,并增加它。通常,nonce由节点为您设置,但它不适用于多个连续事务 实际上只发送最后一个事务的原因是,nonce可以用

我知道这不是智能合约的问题,因为我在混音和单独的国家推动下彻底测试了它。我使用web3和Metamask


合同中的所有值都设置为“test4”

我找到了解决此问题的黑客解决方案,并在web3 github上创建了一个问题

请在此处查看我的问题和解决方案:


我找不到一个简洁的解决方案,但我确信一旦发现问题,就会出现一个解决方案。

在背靠背发送多个事务时,您必须为每个事务设置nonce,并增加它。通常,nonce由节点为您设置,但它不适用于多个连续事务

实际上只发送最后一个事务的原因是,nonce可以用作在挖掘事务之前覆盖事务的一种方式(例如,如果发送的气体太少)

我在前面已经用代码示例回答了这个问题


这就是您正在运行的代码吗?你文章的标题提到了
i
,这听起来像是你在使用
for
循环,循环变量的作用域可能会引起你所描述的挑战。我完全明白你的意思,抱歉混淆了。我以前一直在运行for循环,现在已经不是了,我实际上找到了一个解决问题的方法,我现在将其作为答案发布。谢谢你,我将对此进行研究。尽管这看起来是解决我问题的一种合乎逻辑的方法,但我无法让你的解决方案在我的环境中发挥作用。
    let batch = new this.web3.BatchRequest();

    const arr = [
        {name: "test1", att: 100, def: 100},
        {name: "test2", att: 100, def: 100},
        {name: "test3", att: 100, def: 100},
        {name: "test4", att: 100, def: 100},
    ]
    arr.forEach((d) => {
        batch.add(this.contract.methods.createCountry(d.name, d.att, d.def, 10, this.account).send.request(this.contractObject, (err, res) => {
            if (err) {
                throw err;
            } else {
                console.log(res);
            }
        }));
    });
    console.log(batch);
    batch.execute();