礦工如何訂購交易?
我知道礦工可以做任何他們喜歡做的事情。挖礦前在區塊中包含 0 筆交易或 1000 筆交易。但我假設大多數節點執行相同的程式碼集,即比特幣客戶端。所以,我假設程式碼中必須實現一些邏輯。
- 如果兩個不相關,礦工如何訂購交易?例如,A 支付 C,X 支付 Y。我假設更改塊中的順序會更改雜湊,所以我很好奇比特幣程式碼如何以哪種順序組合它們。
- 比特幣客戶端程式碼如何決定何時開始 nonce + 挖礦過程?我知道它有某種批處理過程,所以它不會開始探勘,直到它可以將一些交易組合成一個塊。但是,組裝這些的程式碼在哪裡?有人說礦工為所欲為,但歸根結底,沒有人編寫自己的客戶端程式碼。必須有一些通用程式碼來實現這個邏輯。
如果兩個不相關,礦工如何訂購交易?例如,A 支付 C,X 支付 Y。我假設更改塊中的順序會更改雜湊,所以我很好奇比特幣程式碼如何以哪種順序組合它們。
交易可以以礦工希望的任何方式在一個區塊中排序,只要將花費該區塊中另一個交易創建的輸出的交易放在其父區塊之後。這個順序對塊雜湊很重要,所以一旦決定了順序,它對於那個塊是固定的。
許多礦工使用比特幣核心的塊模板功能來建構他們的塊。這將選擇要包含的交易,以及包含它們的順序。Bitcoin Core 選擇交易的方式是首先將相關交易組合為包,然後按包支付的費用訂購包。然後按從高到低的順序簡單地選擇包,直到達到塊重量最大值。(實際的選擇比這要復雜一些,但這是它所做的一般概念。)
結果是,許多區塊的交易只是按費率遞減的順序排列,而相互依賴的交易則按順序排列。
我們是否根據排序後的數據集計算雜湊?
merkle 根是按照交易在區塊中的順序計算的。因此,一旦選擇了一個訂單,它就是該區塊唯一正確的訂單。更改順序將更改 merkle 根,從而更改塊雜湊。
比特幣客戶端程式碼如何決定何時開始 nonce + 挖礦過程?我知道它有某種批處理過程,所以它不會開始探勘,直到它可以將一些交易組合成一個塊。但是,組裝這些的程式碼在哪裡?有人說礦工為所欲為,但歸根結底,沒有人編寫自己的客戶端程式碼。必須有一些通用程式碼來實現這個邏輯。
實際的礦工和節點(接收區塊和交易並建構區塊模板)是獨立的軟體。節點一旦同步,就可以隨時建構區塊模板。根據該節點線上的時間長短,它創建的模板可能並不理想,但它仍然可用。沒有要求區塊必須有超過 1 個交易,因此即使節點不知道任何未確認的交易,它也可以創建區塊模板。
所以一個單獨的礦工可能只是啟動他們的節點,等待它同步,然後啟動他們的探勘軟體。沒有任何明智的決定何時開始挖礦。礦工通常希望盡快開始,因為任何區塊獎勵(立即開始)都比沒有區塊獎勵(等待交易)好。