Я использую локальный узел тестовой сети (Geth 1.7.3) в облегченном режиме, и в таком случае квитанция о транзакции не содержит ContractAddress при развертывании нового контракта.
Поэтому я ищу, чтобы определить адрес контракта самостоятельно. Из того, что я прочитал, это определяется из одноразового номера и учетной записи: как вычисляется адрес контракта Ethereum?
Я пытаюсь воспроизвести логику, описанную в этом посте, на Python:
def mk_contract_address(sender, nonce):
return sha3(rlp.encode([normalize_address(sender), nonce]))[12:]
В Javascript с использованием web3 1.0.0-beta.26 и пакета RLP https://github.com/ethereum/wiki/wiki/RLP Моя попытка такова:
var mainAccount = "0x5e03df21b770c783b1641bb3b49924e2fed0b3a7"
var Web3 = require("web3")
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))
var RLP = require('rlp');
web3.eth.getTransactionCount(mainAccount, (err, nonce) => {
console.log(web3.utils.sha3(RLP.encode[sender,nonce]))) ;
});
Но я не получаю тот же адрес после развертывания контракта
Думаю, я наконец понял. Я использую пример в исходном ответе (на Python):
Для отправителя 0x6ac7ea33f8831ea9dcc53393aaa88b25a785dbf0 будут созданы следующие контрактные адреса:
nonce0 = "0xcd234a471b72ba2f1ccf0a70fcaba648a5eecd8d"
Запустив это, я получаю тот же результат:
var Web3 = require("web3")
var web3 = new Web3()
var RLP = require('rlp');
var nonce = 0;
var sender= "0x6ac7ea33f8831ea9dcc53393aaa88b25a785dbf0"
var address = "0x" + web3.utils.sha3(RLP.encode([sender,nonce])).slice(12).substring(14)
адрес:
'0xcd234a471b72ba2f1ccf0a70fcaba648a5eecd8d'
как пример nonce0 выше
Ричард Хоррокс
пользователь19510
sender
определяется? Должен ли он бытьmainAccount
вместо этого (поскольку это учетная запись,nonce
для которой вы получаете)?