在循环中发送.send请求仅设置循环的最后一个值i次

时间:2018-05-17 09:38:02

标签: ethereum web3 web3js metamask

    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();

我知道这不是智能合约的问题,因为我在Remix中进行了彻底的测试并且单独进行了国家推送。我使用web3和Metamask。

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

2 个答案:

答案 0 :(得分:1)

当连续发送许多事务时,您必须为每个事务设置 nonce ,并将其递增。通常,节点会为您设置nonce,但它不适用于多个顺序事务。

实际上仅发送 last 事务的原因是因为 nonce 可用作覆盖事务之前的事务是开采的(就像你用太少的气体发送它一样)。

我之前已使用代码示例

回答了这个问题

Repeating transactions hangs - web3js, local geth

答案 1 :(得分:0)

我发现了一个针对此问题的hacky解决方案,并在web3 github上创建了一个问题。

请在此处查看我的问题和解决方案:https://github.com/ethereum/web3.js/issues/1636

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