Proporcione un resumen de los cambios de estado de la bifurcación en el bloque 1920000

La bifurcación dura durante el bloque 1920000 contenía la ejecución de un cambio de estado irregular. A modo de referencia, sería genial tener una descripción técnica de estos cambios y cómo se aplicaron.

Respuestas (1)

Resumen

El software del cliente del nodo Ethereum se actualizó para realizar los siguientes cambios en la bifurcación de la cadena de bloques en el bloque n.º 1 920 000 mediante la aplicación de las siguientes reglas adicionales de procesamiento de bloques:

  • Marque el bloque #1,920,000 con los datos adicionales dao-hard-fork (Hex:0x64616f2d686172642d666f726b).
  • Agregue el saldo de éter para todas las cuentas DAO a la cuenta del contrato de reembolso y ponga a cero el saldo de todas estas cuentas DAO.

Un total de 12 001 961,845205763407115004 ETH se transfirió de 58 contratos DAO y DAO secundarios al contrato de reembolso en el bloque de bifurcación dura n.º 1 920 000.

No hay transacciones en el bloque n.º 1 920 000 que reflejen estos cambios de saldo, pero estos cambios de saldo se pueden rastrear leyendo el código fuente del software cliente del nodo Ethereum.



Detalles

Aquí está el número de bloque en github.com/ethereum/go-ethereum/params/dao.go#L34 :

var MainNetDAOForkBlock = big.NewInt(1920000)


Hay un marcador de datos adicional en github.com/ethereum/go-ethereum/params/dao.go :

var DAOForkBlockExtra = common.FromHex("0x64616f2d686172642d666f726b")

Puede ver los datos adicionales de la bifurcación dura de DAO en #1,920,000 :ingrese la descripción de la imagen aquí


Y aquí está la dirección del contrato de reembolso en github.com/ethereum/go-ethereum/params/dao.go#L46 :

var DAORefundContract = common.HexToAddress("0xbf4ed7b27f1d666546e30d74d50d173d20bca754")


Y hay una lista de 58 cuentas para drenar ( 1 , 2 , ...) en github.com/ethereum/go-ethereum/params/dao.go#L67-L417 :

const daoDrainListJSON = `
[
   {
      "address":"0xd4fe7bc31cedb7bfb8a345f31e668033056b2728",
      "balance":"186cc8bfaefb7be",
      "extraBalance":"0",
      "extraBalanceAccount":"0xb3fb0e5aba0e20e5c49d252dfd30e102b171a425"
   },
   {
      "address":"0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f",
      "balance":"b14e8feab1ff435",
      "extraBalance":"0",
      "extraBalanceAccount":"0xecd135fa4f61a655311e86238c92adcd779555d2"
   },
   ...


Aquí es donde se aplican los cambios de datos de la bifurcación al bloque #1,920,000 en github.com/ethereum/go-ethereum/core/chain_makers.go#L190-L200 : la primera sección aplica los datos adicionales y la segunda sección llama a la función para realizar la magia bifurcación:

func GenerateChain(config *ChainConfig, parent *types.Block, db ethdb.Database, n int, gen func(int, *BlockGen)) ([]*types.Block, []types.Receipts) {
...
if daoBlock := config.DAOForkBlock; daoBlock != nil {
    limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange)
    if h.Number.Cmp(daoBlock) >= 0 && h.Number.Cmp(limit) < 0 {
        if config.DAOForkSupport {
            h.Extra = common.CopyBytes(params.DAOForkBlockExtra)
        }
    }
}
if config.DAOForkSupport && config.DAOForkBlock != nil && config.DAOForkBlock.Cmp(h.Number) == 0 {
    ApplyDAOHardFork(statedb)
}


Y finalmente, aquí está la función que realiza la magia de bifurcación en github.com/ethereum/go-ethereum/core/dao.go#L63-L74 : el código mueve el saldo de cada cuenta DAO a la dirección de reembolso y pone a cero el Saldo para esas cuentas DAO:

func ApplyDAOHardFork(statedb *state.StateDB) {
    // Retrieve the contract to refund balances into
    refund := statedb.GetOrNewStateObject(params.DAORefundContract)

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

Aquí está el mismo tipo de código para configurar los datos adicionales y transferir los saldos en el cliente de Parity desde github.com/ethcore/parity/ethcore/src/ethereum/ethash.rs#L131-L150 :

    if header.number >= self.ethash_params.dao_hardfork_transition &&
            header.number <= self.ethash_params.dao_hardfork_transition + 9 {
            header.extra_data = b"dao-hard-fork"[..].to_owned();
        }
        header.note_dirty();
//      info!("ethash: populate_from_parent #{}: difficulty={} and gas_limit={}", header.number, header.difficulty, header.gas_limit);
    }

    fn on_new_block(&self, block: &mut ExecutedBlock) {
        if block.fields().header.number == self.ethash_params.dao_hardfork_transition {
            // TODO: enable trigger function maybe?
//          if block.fields().header.gas_limit <= 4_000_000.into() {
                let mut state = block.fields_mut().state;
                for child in &self.ethash_params.dao_hardfork_accounts {
                    let b = state.balance(child);
                    state.transfer_balance(child, &self.ethash_params.dao_hardfork_beneficiary, &b);
                }
//          }
        }


Un total de 12.001.961,845205763407115004 ETH se transfirió de los contratos DAO al contrato de reembolso en el bloque de bifurcación dura n.º 1.920.000.

El siguiente es el cambio en el saldo del bloque #1,919,999 al bloque #1,920,000 en el contrato de reembolso:

> web3.fromWei(eth.getBalance("0xbf4ed7b27f1d666546e30d74d50d173d20bca754",1920000-1),"ether")
0
> web3.fromWei(eth.getBalance("0xbf4ed7b27f1d666546e30d74d50d173d20bca754",1920000),"ether")
12001961.845205763407115004

Y a continuación se muestra el cambio en el saldo del bloque n.º 1 919 999 al bloque n.º 1 920 000 en The DAO y algunos de los DAO secundarios:

// The DAO
> web3.fromWei(eth.getBalance("0xbb9bc244d798123fde783fcc1c72d3bb8c189413",1920000-1),"ether")
1.200000000000000001
> web3.fromWei(eth.getBalance("0xbb9bc244d798123fde783fcc1c72d3bb8c189413",1920000),"ether")
0
> web3.fromWei(eth.getBalance("0xd4fe7bc31cedb7bfb8a345f31e668033056b2728",1920000-1),"ether")
0.11000014249969043
> web3.fromWei(eth.getBalance("0xd4fe7bc31cedb7bfb8a345f31e668033056b2728",1920000),"ether")
0
> web3.fromWei(eth.getBalance("0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f",1920000-1),"ether")
0.008519214441755701
> web3.fromWei(eth.getBalance("0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f",1920000),"ether")
0
// Baddies DAO
> web3.fromWei(eth.getBalance("0x304a554a310c7e546dfe434669c62820b7d83490",1920000-1),"ether")
3642408.527612792706899331
> web3.fromWei(eth.getBalance("0x304a554a310c7e546dfe434669c62820b7d83490",1920000),"ether")
0
// Goodies DAOs
> web3.fromWei(eth.getBalance("0xb136707642a4ea12fb4bae820f03d2562ebff487",1920000-1),"ether")
7277385.711515429122911683
> web3.fromWei(eth.getBalance("0xb136707642a4ea12fb4bae820f03d2562ebff487",1920000),"ether")
0
> web3.fromWei(eth.getBalance("0x84ef4b2357079cd7a7c69fd7a37cd0609a679106",1920000-1),"ether")
598974.326560793095813484
> web3.fromWei(eth.getBalance("0x84ef4b2357079cd7a7c69fd7a37cd0609a679106",1920000),"ether")
0


Aquí hay algunos compromisos de github de interés:

Entonces, por "irregular", el nodo "parpadea" durante este bloque y acepta los cambios de estado de equilibrio sin verificar las firmas txn válidas. ¿Está bien?