Основной вопрос:
Если я это сделаю myContract = eth.contract([abi goes here])
, то я получу:
var contract = myContract.new(
/* args */,
{
from: eth.accounts[0],
data: compiledContract,
gas: 1000000
}
)
Я получаю обратно:
fullhash=0x830e6922af1008...
contract=0xA94C943B7b...
Для чего на самом деле используется это contract
хеш-значение?
По сути, создание контракта приводит к полному хэшу, включающему адрес отправителя и одноразовый номер; 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
Это означает, что для данного адреса отправителя мы можем знать, какими будут будущие адреса для любых контрактов, которые он развертывает, при условии, что он развертывает их в правильном порядке (т. е. с правильным одноразовым номером). Это дает некоторые интересные возможности, такие как отправка эфира на пустой адрес для предварительного финансирования контракта, который будет развернут позже — просто будьте осторожны, чтобы не пропустить одноразовый номер для развертывания контракта на этот конкретный адрес, иначе будет нет шансов получить его обратно - см. «Прятаться у всех на виду» здесь для получения дополнительной информации
По сути, это адрес контракта, который будет использоваться, когда вы захотите взаимодействовать с развернутым контрактом. Для взаимодействия с уже развернутым контрактом вам нужен его ABI и адрес.
Один и тот же контракт может быть развернут несколько раз и, таким образом, может иметь один и тот же ABI, но каждый раз адрес контракта будет другим. Таким образом, адрес контракта является уникальным свойством контракта.
Адрес контракта будет сгенерирован во время отправки контракта в сеть. Создание контракта также является транзакцией, поэтому eth будет генерировать хэш транзакции. В эфириуме контракт — это неуправляемая учетная запись.
Алгоритм генерации адреса контракта Ethereum:
создатель (sender) и сколько транзакций отправил создатель (nonce). Отправитель и одноразовый номер кодируются RLP, а затем хэшируются с помощью Keccak-256.
Пожалуйста, перейдите по ссылке ниже для получения более подробной информации: http://martin.swende.se/blog/Ethereum_quirks_and_vulns.html
Когда вы развернете контракт в geth, eth создаст объект контракта. Если вы хотите получить доступ к развернутому контракту, вам нужна некоторая идентификация. Здесь идентификатор контракта является адресом контракта. А полный хэш — это хеш транзакции. ABI — это файл JSON, предназначенный только для загрузки методов, содержащихся в развернутом контракте. Так что с помощью web3js или любого другого клиента для вызова этих методов. bin — это действующие контрактные инструкции или коды операций.
Прашант Прабхакар Сингх
successfully deployed
. Я думаю, они должны быть одинаковыми.