什麼是比特幣腳本? 【初學者介紹】


比特幣腳本是一種簡單的基於堆棧的編程語言,可以在比特幣區塊鏈上進行交易處理。

這種語言稱為比特幣腳本,也簡稱為腳本。所有比特幣腳本都是用Script 編寫的。

它是一種相當簡單的語言,不是完整的圖靈,這意味著它缺乏某些邏輯功能,包括循環。

這樣做是為了確保沒有比特幣腳本消耗大量計算能力,並且這會損壞比特幣網絡的節點。

腳本幾乎專門用於阻止和解鎖比特幣,因為你無法使用它構建應用程序或運行程序。

Script 提供的簡單性也為比特幣提供了很多安全性,並使開發人員更容易工作,從而防止在與該網絡一起使用的錢包或應用程序設計不佳時丟失資金。

所有比特幣交易都使用腳本來定義如何使用輸出。換句話說,比特幣交易的腳本決定了比特幣被發送給了誰。

比特幣有不同類型的腳本,儘管Pay to Public Key Hash (P2PKH) 是其中最受歡迎的。這是一個簡單的腳本,將比特幣支付到一個地址,即公鑰哈希。

其他腳本可以執行非常複雜的配置,例如創建多重簽名地址。發送到此類地址的那些比特幣需要來自多個私鑰的多個簽名,具體取決於它們的使用方式。

雖然SegWit 腳本P2WPKH 和P2WSH 可以節省交易費用,但到目前為止採用率還不是很高。在這項改進推出4 年多之後,絕大多數UTXO 仍在使用P2PKH。

比特幣腳本的重要概念

腳本類似於Forth,基於堆棧和反向表示法。它是一種不完整的圖靈編程語言。

如果你從未編程過,這對你來說肯定聽起來像中文,但在內心深處,它們都是非常簡單的概念,我們稍後會詳細解釋,以便你了解它的工作原理以及它的重要性。

但在此之前,重要的是要說官方的比特幣軟件(又名比特幣核心)不是用比特幣腳本編寫的。

但是,Bitcoin Script 可能起作用的是比特幣軟件的實現。一種用C++ 編寫的,或者至少是原始實現。

自該程序的第一個版本發布以來,已經用Python、Java 和Go 創建了不同的版本。

在Python 實現的情況下,由於這種語言,比特幣腳本是可能的。確實,對於其他人使用的每個不同的比特幣實現也是如此。

比特幣腳本是一種用於與比特幣軟件交互的編程語言。特別是,腳本告訴比特幣軟件應該如何使用UTXO(未使用的交易輸出)中的硬幣。

當然,對於大多數用戶來說,沒有必要學習使用這種語言。只有與比特幣交互的錢包和其他應用程序需要理解它,而用戶並不知道。

腳本由中本聰在比特幣0.1 版中實現。然而,當時它的發佈出現了幾個錯誤。

一些用戶對此發表了意見,稱比特幣腳本似乎是一個最新的實現,對於實際交易來說還不夠。幸運的是,在最新版本中進行了許多改進,可以完善你的代碼。

1. 基於電池

比特幣腳本使用一種數據結構,如果將其物理表示為堆棧,則可以更好地理解。當添加(推送)或刪除(彈出)新項目時,它會在堆棧上的最後一個項目上完成。

假設我們有3 本書,一本在另一本書之上:

書(A):頂部
書(B):中
書(C):底部

使用比特幣腳本,當執行彈出操作時,A 書首先從堆棧中移除,然後B 書將緊隨其後,最後是C。

如果我們想添加一本新書,推送,我們會在最後一本書上做,在我們的例子中是A。

比特幣腳本以這種方式工作,其中交易按順序堆疊並反向刪除。

2. 類似Forth

腳本與Forth 編程語言非常相似。它於1970 年首次出現,並且非常有名,或者至少是這樣。

Forth 用於開放式固件引導加載程序、航空航天應用和各種需要與硬件接口的嵌入式系統。

3. 反向表示法

也稱為後綴表示法,RPN(反向波蘭表示法)是一種將操作函數放在語句末尾的方法。

例如,如果我們想添加1 + 2,這將被寫為“1 2 +”而不是“1 + 2”對我們來說是常見的。

4. 不完全圖靈

無論是圖靈不完整還是圖靈不完整都意味著Script不允許執行無限循環。有其優點和缺點的東西。

一個優點是你將無法運行設計不佳並陷入無限循環的腳本。編程錯誤和攻擊都可能發生這種情況。

用更專業的術語來說,Script 避免了所謂的停止問題。

其他加密貨幣已經成功地實現了完整的圖靈編程語言,或者至少具有高度的完整性。

當然,這會導致可能出現停止問題的問題,他們通過使用與必須執行的句子數量成比例的佣金來解決這個問題。

沒有完整的圖靈語言的缺點與無法開發更複雜的算法有關,例如,這可能導致智能合約。

比特幣腳本中的BTC 交易如何?

從一個非常簡單的角度來看,比特幣腳本可以被認為是描述交易接收者如何使用資金的指令列表。

大多數比特幣交易只需要一個簡單的腳本,但也可以實現更複雜的腳本。

要了解這一切是如何工作的,讓我們看看支付公鑰哈希(P2PKH) 交易是如何工作的。

P2PKH 交易示例

假設我們想向我們的朋友發送2 BTC。這是使用任何比特幣錢包執行的相當簡單的交易,但我們沒有看到它背後的大量比特幣腳本。

每筆比特幣交易都至少涉及一個鎖定腳本和一個解鎖腳本,以確定這些資金在發送到特定比特幣地址時如何使用。

在P2PKH 交易中,我們不知道我們朋友的公鑰。相反,我們擁有的信息是地址,它是base58 中公鑰的加密貨幣哈希。

使用該地址,我們可以創建一個交易,通過對其進行解碼以獲得公鑰的哈希值。

當我們發送2 BTC 時,一個名為scriptPubKey 的塊腳本將應用於資金。那時,唯一能夠花費2 個比特幣的人是能夠提供產生交易發送哈希的公鑰的人。

但反過來,數字簽名也是必要的,它是使用與上述公鑰匹配的私鑰獲得的。

換句話說,這2 個BTC 屬於任何可以證明自己擁有私鑰的人。在我們的例子中,我們的朋友,除非他與另一個人分享了它。

如果我們的朋友去他的錢包,他會發現餘額現在反映了我們發送給他的這些新資金。

從理論上講,你現在擁有該金額,但在你能夠向網絡證明你是真正的所有者之前,你將無法使用它。

假設我們的朋友想將同樣的2 BTC 發送給其他人。在此之前,你必須首先使用具有兩個要求的輸入創建交易:

我們的朋友想要花費的資金必須指向我們使用交易標識符(TXID)發送給他的交易。
我們的朋友想要花費的資金必須與我們最初發送的資金引用相同的索引號(也稱為向量輸出或vout)。

最後,我們的朋友創建了一個解鎖腳本,稱為scriptSig(比特幣腳本交易輸入),允許你使用資金。

只要我們的amibo提供符合scriptPubKey(Bitcoin Script Transaction Output)設定的條件的scriptSig,就可以發送2個BTC。

另一個人將收到資金,並可以採取相同的步驟將其發送給其他人,等等。

比特幣腳本puro

我們在上面看到的這個例子是比特幣腳本如何工作以允許在比特幣網絡上進行交易的簡化,它使用一種稱為SHA-256 的算法。

但實際情況是,如果我們查看支付發布密鑰哈希(P2PKH) 腳本在交易中的樣子,你會發現如下內容:

OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG

中間的長字符串是公鑰哈希的一個例子。而以“OP_”開頭的命令是操作碼。

最常見的操作碼

在上面的示例中,我們看到了一個通用腳本的樣子。我們注意到“OP_”被大量使用,後面跟著一些東西。這個前綴是用來標識操作碼的,一般稱為Opcodes。

基本上,操作碼是告訴比特幣網絡節點如何處理任何交易請求的命令。

這裡我們有最常見的:

OP_ADD:從堆棧中取出兩個項目(刪除它們),添加它們,然後將結果放回頂部。
OP_EQUAL:從堆棧中取出兩個項目並比較它們以檢查它們是否相同。如果它們相等,則將TRUE 結果放入堆棧。
OP_RETURN:可用於在比特幣區塊鏈上存儲最多80 字節的任意信息。它還將事務的移除標記為無效。OP_RETURN 交易的出口不能被花費,使得該操作碼可以有效地燒掉BTC。
OP_CHECKSIG:驗證交易條目的簽名是否有效。
OP_CHECKMULTISIG – Pay to Script Hash (P2SH) 交易通常使用。它檢查堆棧上的公鑰和簽名,並一一進行比較。當簽名的順序與提供公鑰的順序相同時,資金將可用。
比特幣腳本可以用來做什麼?

儘管我們已經了解了它的原理和工作原理,但除了用於創建指示如何花費交易輸出的腳本之外,我們還發現了一些有用的應用程序。

託管交易

這些應用程序中的第一個與託管或保證金交易有關,這在某些情況下非常有用。

假設我們想從一個新賣家那裡買東西。我們將使用BTC 付款,賣家將向我們發送實物產品到我們家。

我們可能沒有足夠的信心在收到產品之前付款,但如果他們沒有先收到付款,賣家也不想發貨。

解決方案是創建一個多重簽名交易,該交易需要2 或3 個人根據能夠使用加密貨幣的能力進行簽名。在這種情況下,他們將是我們、賣方和另一個在發生爭議時擔任法官的人。

只有其中2 人同意,將加密貨幣發送到任何其他地址就足夠了。

有了這個,賣家可以安全地發送產品,我們付款。

如果我們收到產品並且一切無誤,我們可以與賣家一起簽署多重簽名交易並將資金發放給賣家。這裡不需要第三方的干預。

如果賣家試圖欺騙我們或者我們不想為產品付款,任何一方都可以使用第三方作為中介並釋放資金。

高效的小額支付

假設我們是一項以極少量資金提供的服務的客戶。例如,這是我們在機場使用互聯網的每一分鐘支付的費用。

為我們使用的每一分鐘創建一個交易將是非常低效的,會有太多價值很小的交易和佣金會迅速增加。

解決方案是創建一個價值非常高的多重簽名交易,我們永遠不會在此服務上花費,這需要我們和提供者的簽名。必須先在網絡上確認,然後才能開始使用該服務。

在第一分鐘之後,我們簽署了一項新交易,我們在其中支付了該分鐘的費用,其餘的將被發送回我們的地址。這筆交易從第一筆錢開始。

在第二分鐘,我們會生成另一筆交易,你在兩分鐘內收到付款,其餘的由我們收到。它還使用第一筆交易的資金作為輸入。

目前供應商尚未簽署任何協議,因此這些最新交易未在比特幣網絡上發布。

當提供者準備好收款時,他只需簽署最新的交易。你將在哪裡收取與你對應的金額,其餘的將返回到我們的地址。以前的交易從未公開,如果這樣做,由於雙花問題,它將無效。

顯然,該過程比這要復雜一些,因為你必須採取一些步驟來避免,以便兩方之一可以利用它。例如,在開始操作的交易中,如果提供者從未發送支付他分鐘的交易,我們將永遠無法收回我們的資金,這將導致例如敲詐勒索。

然而,閃電網絡使用了一個非常相似的系統,但有一些要求可以防止這種情況發生。例如,設定一個時間,如果達到,就會釋放資金。同時,提供商可以發送支付給你的其他交易。

時間鎖

在我們上面看到的問題中,我們發現了一個使用時間鎖的例子。這些允許我們在特定的日期和時間或以塊數衡量的特定時間阻止交易費用。

這是通過使用名為LOCK_TIME 的交易參數來實現的,該參數有很多用途,例如創建HTLC 合約,用於使閃電網絡正常工作。

其他應用

除了我們上面看到的更一般的示例之外,還有其他特定的應用程序可以提供給比特幣腳本。一些例子是:

多人彩票
人們可以混合他們的BTC,這樣第三方就更難追踪誰擁有他們以及他們擁有多少。這些服務有助於提高匿名性。
合約雖然不智能,但可以用來生成非常有趣的解決方案,就像我們迄今為止看到的那樣。

概括

比特幣是一種不完整的圖靈編程語言,它非常易於使用以提供更高的安全性。
這決定瞭如何使用交易的輸出,即誰可以訪問UTXO 的資金。
它是一種類似Forth 的語言,由電池供電和反向表示法。

資訊來源:由0x資訊編譯自CRIPTOTARIO。版權歸作者Criptotario所有,未經許可,不得轉載

Total
0
Shares
Related Posts