Mining-Reward
為什麼要對比特幣 Coinbase 交易腳本進行限制?
一個區塊中的 coinbase(獎勵)交易的結構有一些限制。
- 只有一個輸入。
vin.size() == 1
(來源)- 它不引用任何先前的輸出。
vin[0].prevout.IsNull()
(來源)- scriptSig 不是太大。
vin[0].scriptSig.size() <= 100
(來源)- scriptSig 不是太小。
vin[0].scriptSig.size() >= 2
(來源)我看不出任何這些的意義。#1 和 #2 啟用BIP34,但它們不是實現相同結果所必需的。大小限制並沒有真正限制任何事情,如果礦工想要製作一個大塊,他們可以在他們的 coinbase 中添加很多輸出,或者在他們的塊中添加很多交易。
為什麼 coinbase 交易不只是一個交易:
- 至少有一個不引用任何先前輸出的輸入(用於BIP34)
- 允許索取(塊獎勵+費用)超過其可以花費的金額
特別是,coinbase 可以選擇有更多的空輸入,並且可以花費以前的輸出。
我知道對於比特幣來說,改變這些可能為時已晚。**這是過度設計的情況,還是對硬幣庫的任何這些限制存在安全原因?**尤其是放鬆約束 #2,讓我停下來,因為一封比特幣開發郵件列表電子郵件涉及如何允許 coinbase 花費 prevouts 將如何安全地支付礦工以以特定方式探勘鏈重組。
正確答案是:問中本聰。
我對您提出的問題的猜測答案:
- **為什麼只有一個輸入?**您無法預測特定的 coinbase 交易何時會成功進入區塊,您也無法將 coinbase 交易的輸出用於 100 個區塊。這意味著使用正常交易對於任何正常支出都要好得多。如果沒有正常情況下向硬幣庫添加輸入,也許中本聰認為最好禁止輸入以防止意外攻擊。
- **為什麼要引用 null outpoint?**使用與正常事務相同的基本格式可能允許程式碼重用。如果他優化了 coinbase,我們將節省 36 個字節乘以 338,692 個塊(到目前為止),或大約 12 MB。沒什麼大不了的。
- **為什麼將 coinbase 大小限制為 100 字節?**我們知道 Satoshi 使用 coinbase 將消息放入塊 0。也許 100 字節的限制是他試圖阻止其他人使用相同的機制添加超長消息的嘗試。這可能很聰明:從早期到今天,許多礦工將消息添加到他們所有的硬幣庫中——我們只能想像如果這些消息不被限制在 100 字節,那將是多麼令人討厭和浪費。
- **為什麼將最小 coinbase 大小指定為 2 個字節?**這里高度投機,但也許 Satoshi 預見到了 BIP30 中描述的易於複製的硬幣庫,並希望要求人們使用類似於原始外延的東西來幫助防止意外的 TXID 衝突。