Я хотел бы протестировать контракт, используя ~ 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
Возможно, мне нужно дождаться, пока транзакция будет добыта в первую очередь.
Похоже, вы все равно справились с этим, но, вероятно, есть более простой способ провести тестирование с сотнями учетных записей: testrpc .
С помощью testrpc -a 1000
вы можете создать смоделированный блокчейн с тысячей виртуальных счетов, заполненных эфиром. Его использование также будет намного быстрее, поскольку testrpc на самом деле не занимается майнингом, и вам не придется тратить время на отправку виртуального ETH. Чтобы использовать testrpc с консолью geth, используйте geth attach rpc:http://localhost:8545
.
Что касается второго вопроса, contract.at()
он возвращается немедленно — майнинг не требуется, так как он используется для уже существующих контрактов. Вы уверены, что то, что вы получаете, на web3.eth.contract()
самом деле является объектом контракта?
Мэтью Шмидт
=
для установки UnitsFrom, но TotalUnits увеличивается с помощью+=
.Ли
Ли
myContractInstance
vsMyContractInstance
- вот что вызвало ошибку...