Block
哪些操作碼用於在比特幣中儲存文件?
在塊到塊級別上,實際上在
byte[]
級別上編碼了什麼來編碼文件流?
有關塊的特定字節結構的詳細資訊,請參閱比特幣 Wiki 文章等資源。有關交易,請參閱有關交易的文章。
實際的數據儲存發生在事務中,在它們的輸入和/或輸出腳本中。理論上,任何腳本都可以包含任意數據,但由於網路標準,只允許某些類型的腳本。
如需深入了解數據儲存技術,請參閱本文。(完全披露:我是作者之一。)
請注意,當我談到將數據推送到堆棧時:
PUSHDATA(N)
(其中0 <= N <= 75
):將接下來的 N 個字節壓入堆棧。字節值是 dec:N
PUSHDATA1
:下一個字節表示之後要壓入堆棧的字節數。字節值是 dec:76
, hex:0x4c
PUSHDATA2
:接下來的兩個字節表示之後要壓入堆棧的字節數。字節值是 dec:77
, hex:0x4d
此外,使用 PUSHDATA 元素推送的每個數據塊不能超過 520 字節,因此請記住,任何文件都必須分解為 520 字節或更少的塊。
一些儲存數據的方法包括:
- 使用coinbase(或generation)交易(如果您是礦工)在您開采的每個區塊中儲存少量任意數據。該數據取代了通常出現在交易中的輸入。coinbase 交易最多允許 100 字節的數據;但是,其中一些必須用於特殊用途,例如塊高度和額外的隨機數。
- 在帶有 的輸出中
OP_RETURN
。每筆交易可能有一個OP_RETURN
輸出。這樣的輸出值可能為零(因為否則你會燒錢,永遠無法收回)。腳本看起來像OP_RETURN <up to 80 bytes of data>
.OP_RETURN
是字節值 dec:106
, hex:0x6a
,並且數據必須以 PUSHDATA 元素開頭。- 在支付給地址等的輸出中,該收件人地址/密鑰/等。可以替換為任意數據。在這種情況下,請使用正則腳本並替換地址/密鑰/等。與您的數據。這會創建一個您不能花費但必須在 UTXO 集中跟踪的輸出,因此不建議這樣做。這方面的一個例子是使用 P2PKH 腳本
OP_DUP OP_HASH160 <Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
並將 20 字節的公鑰散列替換為 20 字節的其他數據。(請注意,散列與一個PUSHDATA(20)
元素一起被推入堆棧。作為字節,這看起來像:0x 76 a9 14 [your 20 bytes of data] 88 ac
。)如果您要替換例如公鑰,則可能會檢測到您沒有使用真正的公鑰(如果例如,它不以 、 或 開頭0x02
)0x03
,0x04
但雜湊應該與任意數據無法區分。- 在輸入中,使用 P2SH 腳本。然後數據可以儲存在兌換腳本本身或兌換腳本的輸入中。有多種方法可以做到這一點,但通常任意數據將包含在 PUSHDATA 元素中,贖回腳本將以某種方式對其進行操作。一種值得注意的方法涉及兌換腳本,包括
OP_HASH160 <hash of the data to be included> OP_EQUALVERIFY
,以及該腳本的輸入,包括要儲存的數據。此方法確保必須包含數據才能使腳本返回 true。另一種方法是將數據推送到堆棧,然後使用OP_DROP
或OP_2DROP
將其從堆棧中刪除。這是有效的,但攻擊者有可能在事務延展性攻擊中篡改數據。- 您還可以將數據儲存在您的輸出的值欄位中,但這非常低效。
您可以在比特幣交易中儲存任意字節,這些字節未經驗證,但可以在區塊鏈中確認,只要有足夠的費用。
op_return
是輸出腳本中使用的比特幣腳本 op_code,當在腳本解釋器上執行時,將返回無效的腳本執行,從而使輸出“不可使用”。現在,由於腳本執行被中止,同一輸出腳本中的後續數據永遠不會被評估並且可以是任意的。一個有效的、已確認的比特幣交易可以包含不可花費的輸出。
op_return
理論上,只要交易仍然有效(共識),就可以附加任意大小的數據,但節點傳播策略通常將其限制為 80 字節。礦工當然可以確認更大的數據量。