比特幣的編碼語言使用“反向拋光”作為一種符號系統,意味著“3 + 4”這樣的行會隨著複雜性的增加而出現“3 4+”。另一項功能可以追溯到比特幣指令碼的根源——“類似Forth”。這個特性之所以相關,是因為這兩種語言都是“基於堆疊的”。
棧是一種非常常見的資料結構,用Andreas Antonopolous的話說,它允許“棧頂”上的資訊“推送”或“彈出”。前者解釋了向堆疊中新增資訊的過程,而後者描述了從堆疊中刪除資訊的過程。此外,資訊彈出或推送的順序遵循“後進先出”原則。
像“34+”這樣的操作的行為如下:
將“3”按到堆疊上。
將“4”按到堆疊上。
“+”運算子獲取這兩個引數,將它們都從堆疊中彈出,將它們相加,然後將結果推回到堆疊中。(即。, pop, pop, add, push)
在本例中,結果操作導致堆疊上出現“7”,程式終止。
在比特幣指令碼語言中,該操作將遵循相同的步驟,但也將在每個變數之前包含字首“OP”。接下來讓我們看看這些新詞彙是如何在真實的比特幣交易中組合在一起的。
比特幣指令碼語言正在發揮作用
大多數操作都是簽名交易。這包括支付、交換以及大多數涉及公鑰和私鑰的工作。讓我們把傳送者和他的同事Eddie Mitchell之間的交流分開來看。在這裡,傳送者將指定Mitchell(接收者)的公鑰,Mitchell將透過指定使用相同公鑰的簽名來贖回傳送的比特幣。
接下來,此類交易的前兩條指令是用於生成該簽名的簽名和公鑰。該資訊被標識為“<sig>”和“<pubKey>”,並被推送到堆疊中。Mitchell決定這些價值觀,因為他是接受者。交易的前半部分通常稱為“scriptSig”或“解鎖指令碼”。在操作的這一部分中,還引用了以前存在的未使用交易輸出(UTXO)。
UTXO的加入確保了傳送者確實擁有他希望傳送給Mitchell的比特幣的數量。比特幣網路透過挖掘器和比特幣全節點完成驗證。在《掌握比特幣》一書中,作者Andreas Antonopoulos這樣解釋:
每個輸入都包含一個解鎖指令碼,並引用一個以前存在的UTXO。驗證軟體將複製解鎖指令碼,檢索輸入引用的UTXO,並從該UTXO複製鎖定指令碼。
交易的第二部分,即“鎖定指令碼”或“scriptPubkey”,然後由傳送者執行。根據上面的影象,下一條指令“OP_DUP”從堆疊中彈出<pubKey>,複製它,然後將它返回給堆疊。
回到傳送者和他的同事之間的交易,使用者仍然需要向堆疊中新增另一段資料。接下來的資訊是作者在交易開始時指定的公鑰。需要生成簽名來贖回所請求的比特幣。
此時,堆疊頂部有兩個關鍵的雜湊值資料:作者指定的公鑰的雜湊值和Mitchell使用的公鑰的雜湊值。從這裡開始使用“OP_EQUALVERIFY”指令,確保傳送者確實使用了正確的公鑰。在早期經歷了幾次比特幣交易失敗後,作者再三檢查了Mitchell的公鑰。 當公鑰匹配時,OP_EQUALVERIFY指令將消耗這些資料點。使用者現在只剩下一個簽名和一個公鑰。最後一步是驗證該事務的簽名是否正確。
最後的“OP_CHECKSIG”指令,然後將剩餘的兩項從堆疊中彈出,如果<sig>匹配<pubKey>,則該操作將被呈現為有效。
比較、對比和增加複雜性
雖然以上的介紹很簡短,但它應該提供了一個關於如何執行比特幣交易的基本概念。在此基礎上,開發人員和愛好者可以開始嘗試更高階的操作,這將是稍後簡要介紹的主題。
在此基礎上的後續文章將深入探討數字簽名(ECDSA)、多簽名操作、付費到指令碼雜湊值(P2SH)和Timelocks。
更多數字貨幣資訊:www.qukuaiwang.com.cn/news