錢包的價值是通過遍歷鏈中的每個區塊、掃描每筆交易而得出的嗎?
例如,如果我打開 Metamask 或 Coinbase,我會看到餘額。這個餘額是一個固定數字,類似於我們在銀行看到的更直覺地檢查我的淨資產或特定錢包的餘額。
從程序的角度來看,我想知道這是如何完成的。我想我有點理解 UTXO 的這個想法,如果我有像(1 個硬幣,3 個硬幣,5 個硬幣)這樣的硬幣,並且 Alice 為某些服務收取 7 個硬幣,我會發送 5 個硬幣和 3 個硬幣作為輸入。輸出將是 7 個硬幣 -> Alice 錢包和 1 個硬幣回到我的錢包。(讓我們忽略費用)。
但是我如何得出我錢包的餘額呢?
直覺地說,我可以從創世塊開始并線性迭代區塊鏈,但是,每個塊都有 N 個事務,所以這看起來像一個簡單的推導需要掃描 N 個塊 * M 個事務/塊。
這似乎效率低下。我怎樣才能更好地理解這一點?
你的直覺是正確的:為了計算錢包的餘額
bitcoind
,將掃描整個區塊鏈,尋找與其自己的私鑰對應的一組地址。正如您所指出的,這是一項相當耗時的任務。但是我們應該在這裡註意,bitcoind
在引導時需要遍歷區塊鏈並驗證所有交易的有效性,因此與驗證腳本和簽名相比,檢查地址是否屬於其錢包是相當微不足道的,因此它不會為引導增加太多時間。一旦你被引導,你就知道在你驗證之前的任何東西都不會改變,所以你可以在新塊出現時增量掃描它們,這對於今天的程式碼來說通常需要不到一秒鐘的時間。
可以在哪個地址在哪個交易中建立索引,這可以幫助快速定位涉及某個交易的交易,並且有錢包使用它(電子錢包和所有硬體錢包),但這主要是有用的當您在驗證時不知道所有地址,並且您希望將此資訊提供給使用者以便他們不必自己同步時。然而,為了建立索引,他們自己必須驗證整個鏈。順便說一句,這對於所有區塊鏈都是如此,要麼您正在從其起源驗證鏈,要麼您信任第三方不會因遺漏而撒謊(他們無法報告您的地址),例如這種情況對於元遮罩也是如此。
最後一個細節是一些種子模式有一個生日日期/高度,它允許錢包從那個高度開始掃描,因為種子基本上說“不要費心掃描下面,在此之前我沒有地址”。種子越老,這種節省的效率就越低,因為與需要處理的部分相比,跳過的部分將變得更小。