Transactions

getBalance() 是如何工作的?

  • February 22, 2017

該功能如何eth.getBalance()工作?它究竟呼叫了哪個文件?所有參數如何以及在何處傳遞?請有人向我解釋一下。

您可以複製儲存庫並執行git grep getBalance然後git grep GetBalance.

你很快就會進入文件https://github.com/ethereum/go-ethereum/blob/c8695fae359aa327da9203a57ffaf4f2d47d4370/core/state/statedb.go#L245-L251

然後你會做git grep ") Balance",只是為了達到

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

現在,您確實需要閱讀文件。

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

從這裡,我們可以推斷出這只是記憶體中的一個變數,所以必須有人在某個時候填充它!

好。我會把剩下的留給你做練習。您需要弄清楚誰在實例化Account,何時設置此帳戶的狀態,以及持久性在哪裡(提示:DB 函式)。

這是另一種答案。

當 dapp 呼叫web3.eth.getBalance()時,web3 準備並向提供者發送JSON-RPC請求。如果您通過 IPC 進行連接(如果您使用 ,這是通常的情況geth attach),那麼它會寫入一個名為 的文件geth.ipc,然後 geth 會讀取該文件。如果它通過標準 RPC(即來自瀏覽器),web3 會向節點發送一個 HTTP POST(通常是在http://localhost:8545)。

然後計算最終結果,但是節點執行它(不同節點執行不同),然後將答案發回。web3.js 對其進行解碼並返回一個普通的 javascript 對象(在本例中為 BigNumber)。

這個請求和回复的形式是什麼?它基本上是純 JSON。沒有理由必須是 web3.js。您可以使用curl(通過 HTTP)獲得相同的效果。例如

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

這是使用testrpc,它將所有數據儲存在記憶體中,而不是磁碟上。因此,部分答案是“視情況而定”。

引用自:https://ethereum.stackexchange.com/questions/12417