Отправка запросов .send в цикле только устанавливает последнее значение цикла i количество раз - PullRequest
0 голосов
/ 17 мая 2018
    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 голосов
/ 18 мая 2018

При отправке многих транзакций подряд необходимо установить nonce для каждой транзакции, а также увеличить его.Обычно одноразовый номер устанавливается для вас узлом, но он не работает для нескольких последовательных транзакций.

Причина, по которой фактически отправляется только транзакция последняя , заключается в том, что nonce можно использовать как способ переопределить транзакций до их добычи (например, если вы отправили слишком мало газа).

Я ответил на этот вопрос ранее, сПример кода

Повторяющиеся зависания транзакций - web3js, локальный geth

0 голосов
/ 17 мая 2018

Я нашел хакерское решение этой проблемы и создал проблему на github web3.

См. Мою проблему и мое решение здесь: https://github.com/ethereum/web3.js/issues/1636

Я не смог найти правильное решение, но я уверен, что как только проблема будет поднята, решение будет представлено.

...