Частная сеть, контрактное тестирование — перебирать адреса и повторять вызовы функций

Я хотел бы протестировать контракт, используя ~ 100 разных учетных записей. Для начала я хотел бы инкапсулировать взаимодействие контрактов с последовательными адресами в цикле for. Ради аргумента, используя этот контракт:

contract UnitCounter {
    mapping (address => uint256) public UnitsFrom;
    uint256 public TotalUnits;

    function submitUnits(uint256 Units) {
        UnitsFrom[msg.sender] = Units;
        TotalUnits += Units;
    }
}

Я представляю, как это сделать, используя следующий псевдокод (где abiсверху):

var MyContract = web3.eth.contract(abi)
var myContractInstance = MyContract.at('0xE522E4A145f345925c80C5Cf4b67a5fa00304875')
var randnumberlist = [4,5,1,3,8,7,2,8,9,9,2]
for (var x = 0; x < 10; x++){
    personal.newAccount("pword")
    rand=randnumberlist[x]
    personal.unlockAccount(eth.coinbase,"coinbasepword",300) 
    eth.sendTransaction({from: eth.coinbase, to: eth.accounts[personal.listAccounts.length-1], gasPrice: "1000"})
    personal.unlockAccount(eth.accounts[personal.listAccounts.length-2],"pword",300)
    var randnumberlist = [4,5,1,3,8,7,2,8,9,9,2]
    myContractInstance.submitUnits(rand, {from: eth.accounts[personal.listAccounts.length-1], gas:3000000})
}

Можно ли создавать циклы, подобные приведенным выше, с помощью консоли geth javascript? Если нет, могу ли я использовать параметры командной строки geth с циклом, реализованным в командной строке ОС?

Глядя на документы , кажется, что это невозможно. Как еще я мог бы достичь этого?

РЕДАКТИРОВАТЬ:

Я думаю, что почти справился (исправлен код). Однако теперь я получаю эту ошибку:

ReferenceError: 'MyContractInstance' is not defined
    at <anonymous>:10:1

Возможно, мне нужно дождаться, пока транзакция будет добыта в первую очередь.

Я не уверен, что ваш пример взят из реального кода, но похоже, что в нем есть небольшая ошибка. submitUnits использует =для установки UnitsFrom, но TotalUnits увеличивается с помощью +=.
@MatthewSchmidt спасибо - это было намеренно - сопоставление и промежуточный итог. Код фактически переработан из этого вопроса .
Была опечатка myContractInstancevs MyContractInstance- вот что вызвало ошибку...

Ответы (1)

Похоже, вы все равно справились с этим, но, вероятно, есть более простой способ провести тестирование с сотнями учетных записей: testrpc .

С помощью testrpc -a 1000вы можете создать смоделированный блокчейн с тысячей виртуальных счетов, заполненных эфиром. Его использование также будет намного быстрее, поскольку testrpc на самом деле не занимается майнингом, и вам не придется тратить время на отправку виртуального ETH. Чтобы использовать testrpc с консолью geth, используйте geth attach rpc:http://localhost:8545.

Что касается второго вопроса, contract.at()он возвращается немедленно — майнинг не требуется, так как он используется для уже существующих контрактов. Вы уверены, что то, что вы получаете, на web3.eth.contract()самом деле является объектом контракта?