В чем смысл хэша «контракта», возвращаемого Geth?

Основной вопрос:

Если я это сделаю myContract = eth.contract([abi goes here]), то я получу:

var contract = myContract.new(
  /* args */,
  {
    from: eth.accounts[0],
    data: compiledContract,
    gas: 1000000
  }
)

Я получаю обратно:

fullhash=0x830e6922af1008... 
contract=0xA94C943B7b...

Для чего на самом деле используется это contractхеш-значение?

Ответы (3)

Это может помочь

По сути, создание контракта приводит к полному хэшу, включающему адрес отправителя и одноразовый номер; contractзатем берется адрес, за 0xкоторым следуют последние 20 байтов этого хэша. Это становится известно сразу после создания контракта, поскольку зависит только от адреса отправителя и одноразового номера и будет включено в цепочку блоков после успешного завершения транзакции.

опустив поле to, будет создан контракт. Но как определяется адрес контракта? Возьмем, к примеру, эту транзакцию

console.log(web3.eth.getTransactionReceipt('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5').contractAddress);
//0x950041c1599529a9f64cf2be59ffb86072f00111

Адрес контракта — это последний 160-битный хэш адреса отправителя, и его одноразовый номер можно определить заранее. Для этой транзакции отправитель и одноразовый номер могут быть найдены с помощью

var contractTx = web3.eth.getTransaction('0x77a4f46ff7bf8c084c34293fd654c60e107df42c5bcd2666f75c0b47a9352be5');
console.log(contractTx.from);
//0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f
console.log(contractTx.nonce);
//0

Таким образом, адрес контракта

console.log('0x' + util.bufferToHex(util.rlphash(['0x84f9d8b0e74a7060e20b025c1ea63c2b171bae6f', 0])).slice(26));
//0x950041c1599529a9f64cf2be59ffb86072f00111

https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f

Это означает, что для данного адреса отправителя мы можем знать, какими будут будущие адреса для любых контрактов, которые он развертывает, при условии, что он развертывает их в правильном порядке (т. е. с правильным одноразовым номером). Это дает некоторые интересные возможности, такие как отправка эфира на пустой адрес для предварительного финансирования контракта, который будет развернут позже — просто будьте осторожны, чтобы не пропустить одноразовый номер для развертывания контракта на этот конкретный адрес, иначе будет нет шансов получить его обратно - см. «Прятаться у всех на виду» здесь для получения дополнительной информации

По сути, это адрес контракта, который будет использоваться, когда вы захотите взаимодействовать с развернутым контрактом. Для взаимодействия с уже развернутым контрактом вам нужен его ABI и адрес.

Один и тот же контракт может быть развернут несколько раз и, таким образом, может иметь один и тот же ABI, но каждый раз адрес контракта будет другим. Таким образом, адрес контракта является уникальным свойством контракта.

Контактный адрес не создается после развертывания контракта. Он создается, когда вы отправляете транзакцию для создания контракта. Вы уверены, что это не адрес контракта? Вы можете развернуть свой контракт в тестовой сети и сравнить этот адрес контракта с адресом после того, как контракт будет successfully deployed. Я думаю, они должны быть одинаковыми.

Адрес контракта будет сгенерирован во время отправки контракта в сеть. Создание контракта также является транзакцией, поэтому eth будет генерировать хэш транзакции. В эфириуме контракт — это неуправляемая учетная запись.

Алгоритм генерации адреса контракта Ethereum:

создатель (sender) и сколько транзакций отправил создатель (nonce). Отправитель и одноразовый номер кодируются RLP, а затем хэшируются с помощью Keccak-256.

Пожалуйста, перейдите по ссылке ниже для получения более подробной информации: http://martin.swende.se/blog/Ethereum_quirks_and_vulns.html

Когда вы развернете контракт в geth, eth создаст объект контракта. Если вы хотите получить доступ к развернутому контракту, вам нужна некоторая идентификация. Здесь идентификатор контракта является адресом контракта. А полный хэш — это хеш транзакции. ABI — это файл JSON, предназначенный только для загрузки методов, содержащихся в развернутом контракте. Так что с помощью web3js или любого другого клиента для вызова этих методов. bin — это действующие контрактные инструкции или коды операций.