Wie funktioniert getBalance()?

Wie funktioniert die eth.getBalance()Funktion? Welche Datei ruft es genau auf? Wie und wo werden alle Parameter übergeben? Bitte erklärt es mir jemand.

Antworten (2)

git grep getBalanceSie können das Repository klonen und dann und ausführen git grep GetBalance.

Sie werden bald in die Datei https://github.com/ethereum/go-ethereum/blob/c8695fae359aa327da9203a57ffaf4f2d47d4370/core/state/statedb.go#L245-L251 fallen

Dann würden Sie tun git grep ") Balance", nur um zu erreichen

https://github.com/ethereum/go-ethereum/blob/c8695fae359aa327da9203a57ffaf4f2d47d4370/core/state/state_object.go#L370-L372

Jetzt müssen Sie die Dateien wirklich lesen.

// empty returns whether the account is considered empty.
func (s *StateObject) empty() bool {
    return s.data.Nonce == 0 && s.data.Balance.BitLen() == 0 && bytes.Equal(s.data.CodeHash, emptyCodeHash)
}

// Account is the Ethereum consensus representation of accounts.
// These objects are stored in the main account trie.
type Account struct {
    Nonce    uint64
    Balance  *big.Int
    Root     common.Hash // merkle root of the storage trie
    CodeHash []byte
}

Daraus können wir ableiten, dass dies nur eine Variable im Speicher ist, also muss sie irgendwann von jemandem gefüllt werden!

Also. Den Rest überlasse ich Ihnen als Übung. Sie müssen herausfinden, wer eine instanziiert Account, wann der Status dieses Kontos gesetzt ist und wo die Persistenz ist (TIPP: DB-Funktionen).

Hier ist eine andere Art von Antwort.

Wenn ein dapp aufruft web3.eth.getBalance(), bereitet web3 eine JSON-RPC- Anforderung vor und sendet sie an den Anbieter. Wenn Sie über IPC verbunden sind (dies ist das Übliche, wenn Sie verwenden geth attach), schreibt es in eine Datei namens geth.ipc, die dann von Geth gelesen wird. Wenn es über den Standard-RPC geht (dh von einem Browser), sendet web3 einen HTTP-POST an den Knoten (normalerweise an http://localhost:8545).

Das Endergebnis wird dann berechnet, wie auch immer der Knoten es macht (verschiedene Knoten machen es anders) und dann wird die Antwort zurückgesendet. web3.js decodiert es und gibt ein normales Javascript-Objekt zurück (in diesem Fall eine BigNumber).

Welche Form haben diese Anfrage und Antwort? Es ist im Grunde einfaches JSON. Es gibt keinen Grund, dass es web3.js sein muss. Sie können curl(über HTTP) für denselben Effekt verwenden. Zum Beispiel

curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xe7466f6aa35b04ac950274833dc9c43ef8e05d33", "latest"],"id":1}' localhost:8545
# returns
# {"id":1,"jsonrpc":"2.0","result":"0x00000000000000056bc75e2d63100000"}

Dies verwendete testrpc , das alle seine Daten im Speicher speichert, nicht auf der Festplatte. Die Antwort lautet also teilweise: "Es kommt darauf an."

Sie haben nichts über die Dateien gesagt, die verwendet werden?
Wie gesagt, es kommt auf den Kunden an. testrpc speichert seine Kette meines Wissens überhaupt nicht in Dateien.