Transactions
getBalance() 是如何工作的?
該功能如何
eth.getBalance()
工作?它究竟呼叫了哪個文件?所有參數如何以及在何處傳遞?請有人向我解釋一下。
您可以複製儲存庫並執行
git grep getBalance
然後git grep GetBalance
.然後你會做
git grep ") Balance"
,只是為了達到現在,您確實需要閱讀文件。
// 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,它將所有數據儲存在記憶體中,而不是磁碟上。因此,部分答案是“視情況而定”。