Что означают ключи «balance», «extraBalance» и «extraBalanceAccount» в dao-hardfork

Список 58 учетных записей, затронутых хардфорком DAO, доступен здесь: https://github.com/ethereum/go-ethereum/blob/5f55d95aea433ef97c48ae927835d833772350de/params/dao.go#L67 .

В списке четыре ключа: [адрес, баланс, экстраБаланс, экстраБалансСчет], что означают ключи «баланс», «экстраБаланс» и «экстраБалансСчет».

Одно из возможных объяснений заключается в том, что ключ «баланс» означает баланс на счете до хардфорка. Это не относится к следующим учетным записям:

0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f,
0x319f70bab6845585f412ec7724b744fec6095c85, 
0x779543a0491a837ca36ce8c635d6154e3c4911a6,
0x5c6e67ccd5849c0d29219c4f95f1a7a93b3f5dc5, 
0x6b0c4d41ba9ab8d8cfb5d379c69a612f2ced8ecb,  
0xd1ac8b1ef1b69ff51d1d401a476e7e612414f091,  
0xf0b1aa0eb660754448a7937c022e30aa692fe0c5, 
0xe308bd1ac5fda103967359b2712dd89deffb7973, 
0xac1ecab32727358dba8962a0f3b261731aad9723, 
0x304a554a310c7e546dfe434669c62820b7d83490, 
0x84ef4b2357079cd7a7c69fd7a37cd0609a679106, 
0xbb9bc244d798123fde783fcc1c72d3bb8c189413, 

В качестве примера: баланс в адресе 0x2c19c7f9ae8b751e37aeb2d93a699722395ae18fдо хардфорка не соответствует балансу, указанному в списке JSON

>>> w3.eth.getBalance(to_checksum_address('0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f'), 1920000-1)
8519214441755701
>>> hex_to_integer('b14e8feab1ff435')
798519214441755701

Ответы (1)

Единственное поле, используемое в этом списке, это address, все остальные поля, вероятно, просто информативны.

Вы можете проверить это в consensus/misc/dao.go:

// ApplyDAOHardFork modifies the state database according to the DAO hard-fork
// rules, transferring all balances of a set of DAO accounts to a single refund
// contract.
func ApplyDAOHardFork(statedb *state.StateDB) {
    // Retrieve the contract to refund balances into
    if !statedb.Exist(params.DAORefundContract) {
        statedb.CreateAccount(params.DAORefundContract)
    }

    // Move every DAO account and extra-balance account funds into the refund contract
    for _, addr := range params.DAODrainList() {
        statedb.AddBalance(params.DAORefundContract, statedb.GetBalance(addr))
        statedb.SetBalance(addr, new(big.Int))
    }
}

Как видите, addrиспользуется только адрес. Он получает баланс (независимо от того, какой баланс у него есть) с помощью statedb.GetBalance(addr)и добавляет его в контракт возврата DAO сstatedb.AddBalance(params.DAORefundContract,....)

И есть одна вещь: код форка не мог знать, сколько баланса будет на счете на блоке 1920000, поэтому не могло быть никакого предварительного расчета балансов на счетах. Потому что для применения форка нужно раздать исходный код майнерам, а это не делается за несколько минут.

Если вы хотите убедиться, что вилка была применена правильно, просто проверьте хэш блока или корневой хеш состояния.