如何計算區塊鏈中可證明不可使用的 UTXO?
據我了解,可以通過從塊高度 0 開始遍歷區塊鏈併計算輸出數量並減去每個塊的輸入數量並總結結果來計算 UTXO。除此之外,減去任何可證明不可花費的事務,例如 OP_RETURN。我相信可證明不可花費的交易清單很長:
- 以 OP_RETURNS 開頭的事務輸出
- 大於交易大小限制的交易輸出
上面有沒有知識空白?
如果不是,您如何計算可證明不可花費的交易列表。
- OP_RETURNS:是否只計算TX中有OP_RETURN的TX?這裡還有什麼可做的嗎?
- TX 大小限制:如何計算這個?
當您說“交易”時,我假設您的意思是“交易輸出”。
實際上不可能有大於交易大小限制的交易輸出。否則,包含該輸出的交易將不在區塊鏈中。
相反,我認為您正在尋找的是輸出腳本大於最大腳本大小。此類腳本可證明是不可使用的,並且可以從 UTXO 集中排除。
比特幣核心具有確定輸出是否不可花費的功能。這不是一個詳盡的列表,只是您提到的兩個:以 OP_RETURN 開頭的腳本,以及大於最大腳本大小的腳本。
然而,還有其他腳本可證明是不可使用的,只是它們需要更多的工作來證明。例如,使用無效或禁用操作碼的腳本可證明是不可使用的。如果在驗證支出時在腳本中發現任何此類操作碼,則腳本解釋器將失敗。
但即使這樣也有問題。未執行的未知操作碼(例如在未執行的 IF 分支中),腳本仍然可以通過驗證。但是,如果腳本在任何地方包含任何禁用的操作碼(有一些例外,因為一些“禁用”的操作碼實際上只是被徹底刪除了),它是無效的。
也有可能需要將大於最大堆棧項大小的內容推送到堆棧的腳本。或者操作堆棧項的東西,使其在與 OP_CHECKLOCKTIMEVERIFY 或 OP_CHECKSEQUENCEVERIFY 一起使用時變為負鎖定時間。
然後是輸出腳本被無效程式,例如只有一個 OP_ELSE 或 OP_ENDIF,而前面沒有 OP_IF/OP_NOTIF。
所有這些事情都很難確定,並且確實需要檢查各個腳本。他們還需要一個符合共識的腳本解釋器,這本身就很難做到,因為腳本的確切語義實際上並不清楚。
當我昨天搜尋其他內容並遇到錯誤時,我發現這段程式碼可能對您的情況有所幫助:
<https://github.com/in3rsha/bitcoin-utxo-dump>