Определение адреса контракта с помощью web3 1.0

Я использую локальный узел тестовой сети (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]))) ;
});

Но я не получаю тот же адрес после развертывания контракта

Просто для проверки: устанавливаете ли вы адрес отправителя и одноразовый номер одинаковыми значениями при запуске каждого из двух методов выше?
Где senderопределяется? Должен ли он быть mainAccountвместо этого (поскольку это учетная запись, nonceдля которой вы получаете)?

Ответы (1)

Думаю, я наконец понял. Я использую пример в исходном ответе (на 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 выше

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