Geben Sie eine Zusammenfassung der Fork-Statusänderungen in Block 1920000

Der Hard Fork während Block 1920000 beinhaltete die Ausführung einer irregulären Zustandsänderung. Zu Referenzzwecken wäre es toll, einen technischen Überblick über diese Änderungen und wie sie durchgesetzt wurden zu haben.

Antworten (1)

Zusammenfassung

Die Client-Software des Ethereum-Knotens wurde aktualisiert, um die folgenden Änderungen vorzunehmen, um die Blockkette in Block Nr. 1.920.000 hart zu forken, indem die folgenden zusätzlichen Blockverarbeitungsregeln angewendet werden:

  • Markieren Sie Block Nr. 1.920.000 mit den zusätzlichen Daten dao-hard-fork (Hex:0x64616f2d686172642d666f726b).
  • Addieren Sie das Ether-Guthaben für alle DAO-Konten zum Rückerstattungsvertragskonto und nullen Sie das Guthaben für alle diese DAO-Konten.

Insgesamt 12.001.961,845205763407115004 ETH wurden von 58 The DAO- und Child-DAO-Verträgen in den Rückerstattungsvertrag am Hard-Fork-Block #1.920.000 gefegt.

Es gibt keine Transaktionen in Block #1.920.000, die diese Kontostandsänderungen widerspiegeln, aber diese Kontostandsänderungen können durch Lesen des Quellcodes für die Client-Software des Ethereum-Knotens nachverfolgt werden.



Einzelheiten

Hier ist die Blocknummer in github.com/ethereum/go-ethereum/params/dao.go#L34 :

var MainNetDAOForkBlock = big.NewInt(1920000)


Es gibt einen zusätzlichen Datenmarker in github.com/ethereum/go-ethereum/params/dao.go :

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

Sie können die DAO-Hard-Fork-Zusatzdaten in #1.920.000 sehen :Geben Sie hier die Bildbeschreibung ein


Und hier ist die Adresse des Rückerstattungsvertrags in github.com/ethereum/go-ethereum/params/dao.go#L46 :

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


Und in github.com/ethereum/go-ethereum/params/dao.go#L67-L417 gibt es eine Liste mit 58 zu löschenden Konten ( 1 , 2 , ...) :

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


Hier werden die Fork-Datenänderungen auf Block #1.920.000 in github.com/ethereum/go-ethereum/core/chain_makers.go#L190-L200 angewendet – der erste Abschnitt wendet die zusätzlichen Daten an und der zweite Abschnitt ruft die Funktion auf auf Führen Sie die Forking-Magie durch:

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)
}


Und schließlich ist hier die Funktion, die die Forking-Magie in github.com/ethereum/go-ethereum/core/dao.go#L63-L74 ausführt – der Code verschiebt das Guthaben von jedem DAO-Konto auf die Rückerstattungsadresse und löscht die Guthaben für diese DAO-Konten:

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))
        }
    }
}

Hier ist die gleiche Art von Code, um die zusätzlichen Daten festzulegen und die Salden im Parity-Client von github.com/ethcore/parity/ethcore/src/ethereum/ethash.rs#L131-L150 zu übertragen :

    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);
                }
//          }
        }


Insgesamt 12.001.961,845205763407115004 ETH wurden aus den DAO-Verträgen in den Rückerstattungsvertrag beim Hard-Fork-Block #1.920.000 gefegt.

Es folgt die Änderung des Saldos von Block Nr. 1.919.999 zu Block Nr. 1.920.000 im Erstattungsvertrag:

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

Und das Folgende ist die Änderung des Kontostands von Block Nr. 1.919.999 zu Block Nr. 1.920.000 in The DAO und einigen der untergeordneten DAOs:

// 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


Hier sind einige Github-Commits von Interesse:

Bei „unregelmäßig“ „blinkt“ der Knoten also während dieses Blocks und akzeptiert die Änderungen des Gleichgewichtszustands, ohne auf gültige TXN-Signaturen zu prüfen. Ist das richtig?