Block

哪些操作碼用於在比特幣中儲存文件?

  • March 16, 2019

在塊到塊級別上,實際上在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。)如果您要替換例如公鑰,則可能會檢測到您沒有使用真正的公鑰(如果例如,它不以 、 或 開頭0x020x030x04但雜湊應該與任意數據無法區分。
  • 在輸入中,使用 P2SH 腳本。然後數據可以儲存在兌換腳本本身或兌換腳本的輸入中。有多種方法可以做到這一點,但通常任意數據將包含在 PUSHDATA 元素中,贖回腳本將以某種方式對其進行操作。一種值得注意的方法涉及兌換腳本,包括OP_HASH160 <hash of the data to be included> OP_EQUALVERIFY,以及該腳本的輸入,包括要儲存的數據。此方法確保必須包含數據才能使腳本返回 true。另一種方法是將數據推送到堆棧,然後使用OP_DROPOP_2DROP將其從堆棧中刪除。這是有效的,但攻擊者有可能在事務延展性攻擊中篡改數據。
  • 您還可以將數據儲存在您的輸出的值欄位中,但這非常低效。

您可以在比特幣交易中儲存任意字節,這些字節未經驗證,但可以在區塊鏈中確認,只要有足夠的費用。

op_return是輸出腳本中使用的比特幣腳本 op_code,當在腳本解釋器上執行時,將返回無效的腳本執行,從而使輸出“不可使用”。

現在,由於腳本執行被中止,同一輸出腳本中的後續數據永遠不會被評估並且可以是任意的。一個有效的、已確認的比特幣交易可以包含不可花費的輸出。

op_return理論上,只要交易仍然有效(共識),就可以附加任意大小的數據,但節點傳播策略通常將其限制為 80 字節。礦工當然可以確認更大的數據量。

引用自:https://bitcoin.stackexchange.com/questions/84338