Wie kann ich die halbe Schürfprämie auf eine Adresse übertragen?

Das Erstellen einer Dapp, für die die Hälfte der zugewiesenen Mining-Gebühr erforderlich ist, sollte an eine Adresse gehen.

Ich habe es geschafft, das Mining sowie die Blockbelohnung zu reduzieren:

konsens.go

    // Accumulate the rewards for the miner and any included uncles
    reward := new(big.Int).Set(blockReward)
    rew := new(big.Int).Set(blockReward)
    r := new(big.Int)
    for _, uncle := range uncles {
        r.Add(uncle.Number, big8)
        r.Sub(r, header.Number)
        r.Mul(r, blockReward)
        r.Div(r, big8)
        state.AddBalance(uncle.Coinbase, r)

        r.Div(blockReward, big32)
        reward.Add(reward, r)
    }

    changedRew := new(big.Int).Set(rew) // half reward
    changedRew.Div(changedRew, big.NewInt(2))
    log.Warn("Mining block reward status .. ", "CHANGED", changedRew )
    state.AddBalance(header.Coinbase, changedRew)
}

state_transition.go

        if vmerr == vm.ErrInsufficientBalance {
            return nil, 0, false, vmerr
        }
    }
    st.refundGas()
    log.Warn("Half fee taken away ")
    // change price 
    st.state.AddBalance(st.evm.Coinbase, changedRew.Div(new(big.Int).Mul(new(big.Int).SetUint64(st.gasUsed()), st.gasPrice), big.NewInt(2)))

    return ret, st.gasUsed(), vmerr != nil, err
}

Wie kann ich nun die andere Hälfte auf eine Adresse überweisen? Wenn ich ein zu übertragendes Konto/eine Adresse angebe, kann dies leicht geändert werden, ohne die Sperrregeln zu beeinflussen. Wie kann ich es sicher tun?

PS: Nur ein konstantes Konto für jeden Knoten, um die halbe Mining-Gebühr zu überweisen.

Antworten (1)

So einfach geht's:

the_other_half_addr:=common.HexToAddress("0xlajfklsadjflsafjklsadjdflkadjfl")
state.AddBalance(the_other_half_addr,changedRew)

Sie tun es sicher, aber Sie haben vergessen, die Hälfte auch von den Onkeln zu nehmen.

Danke ! Es ist sicher, denn wenn die Adresse geändert wird, führt dies zu einem anderen Block-Hash. Ist das wahr?
Ja, die Root() des types.Block gibt eine andere Ausgabe zurück, da jede Änderung am State seinen Hash ändert. Aber Sie müssen dies in einem Test überprüfen, nur um sicherzugehen, dass Sie keinen Fehler gemacht haben. Erstellen Sie 2 verschiedene datadirs und bauen Sie einen Block mit unterschiedlichen Adressen ab. Die Hashes von Root() und Hash() des Blocks sollten in beiden datadirunterschiedlich sein. Wenn jemand diese Adresse ändert und seinen eigenen Knoten betreibt, wird sein Block vom Netzwerk auf dem ersten Block mit unterschiedlichem Hash verworfen.
Ich habe es versucht. Wenn ich den Schlüsselspeicher für datadir und gleich behalte datadir2, habe ich einen anderen stateRootHash erhalten. Von Anfang datadiran habe ich den gleichen Schlüsselspeicher und behalten minerBase. Dann habe ich das Setup von erneut ausgeführt datadir2, was mir jedes Mal den gleichen Status-Hash gab. Dann habe ich die stateRootKontoadresse von der Quelle geändert, der Hash war diesmal anders. Also wird es verifiziert. Aber was könnte der mögliche Grund sein, warum ich nicht den gleichen Status wie datadir(Originalordner) erhalten konnte?
Außerdem transactions Rootsind sie in jedem Fall gleich. Liegt das daran, dass ich leere Blöcke abbaue? Ich denke, Transaktionen haben einen anderen Baum als der Staat.