У контрактов также есть одноразовый номер?

У контрактов также есть одноразовый номер, и если да, то как он рассчитывается? Обычные учетные записи имеют одноразовый номер, который увеличивается с каждой транзакцией. Однако контракты не могут совершать транзакции, они могут совершать только вызовы, инициированные транзакциями.

Но контракты по-прежнему могут создавать другие контракты, и для вновь созданного контракта важен одноразовый номер отправителя. Таким образом, кажется, что контракты также имеют одноразовые номера. Увеличивается ли этот одноразовый номер каждый раз, когда они вызывают другой контракт, или только при создании другого контракта?

Ответы (2)

Да, в контрактах есть одноразовые номера . В EIP 161 одноразовый номер контракта начинался с 1 , а до EIP 161 одноразовый номер начинался с 0. Одноразовый номер контракта увеличивается только тогда, когда этот контракт создает другой контракт (ссылка Zanzu YP). Когда контракт вызывает функцию другого контракта, так называемая «внутренняя транзакция», одноразовый номер не увеличивается.

Nonce можно получить с помощью web3.eth.getTransactionCount. Для контракта нет встроенного метода доступа к одноразовому номеру учетной записи, в том числе к своему собственному. (Контракт может использовать свое хранилище для отслеживания собственного одноразового номера.)

Чтобы было понятно, в Ethereum есть только 2 типа учетных записей, и все они имеют одни и те же 4 «физических» свойства: одноразовый номер, баланс (в wei), хеш корневой памяти хранилища и код. Единственная «физическая» разница в том, что контракт имеет ненулевой код.

С точки зрения поведения, между контрактами и обычными счетами есть еще некоторые отличия. Увеличение одноразового номера — это одно из поведенческих отличий; еще один важный вопрос: где хранится закрытый ключ для контракта?


Чтобы уточнить, что « обычные учетные записи имеют одноразовый номер, который увеличивается с каждой транзакцией », одноразовый номер учетной записи без контракта увеличивается только тогда, когда эта учетная запись инициирует транзакцию (когда это fromучетная запись отправителя). Когда получателем является учетная запись ( toучетная запись), ее одноразовый номер не увеличивается.

Ответ на ваш вопрос можно найти в желтой газете :

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

Помните: в Ethereum контракты — это учетные записи со связанным с ними кодом.