當談及智慧型合約時,大多數人都會下意識地把位元幣排除在討論範圍之外,因為當下流行的觀點是位元幣不具有智慧型合約的能力。但是今天想跟大家介紹的內容則正好與此相反:即位元幣從誕生之日即擁有支援智慧型合約的能力,下面讓我們一起來探個究竟。
位元幣底層採用了乙個很特別的交易模型設計,即 utxo(unspent transaction outputs) 模型。這裡我們簡單介紹一下,首先來看最基本的交易是如何表示的。
每乙個位元幣交易主要包括兩部分:輸入記錄和輸出記錄。
每條輸出記錄主要包括的資訊:
每條輸入記錄主要包括的資訊:
假設有人已成功發給我乙個位元幣,那麼在鏈上就存在一條歷史交易記錄 tx_1。它的輸出記錄中有一條(記為tx_1_out_1
)包含了數量為 1 的位元幣以及乙個只能由我的私鑰才能「開啟」的「鎖」(鎖定指令碼)。也正是由於這把「鎖」的存在,別人才無法使用這個位元幣。
現在我想把這個位元幣轉給另外乙個人,那麼需要構建乙個新的交易記錄 tx_2。它的輸入記錄中包含了對之前交易輸出tx_1_out_1
的引用,以及一段由我的私鑰簽名過的「鑰匙」(解鎖指令碼);輸出記錄(記為tx_2_out_1
)中則包含了位元幣數量 1,以及乙個只有接收人才能「開啟」的「鎖」(另乙個鎖定指令碼)。
這個新的交易 tx_2 被我傳送給礦工,且只有通過了礦工對解鎖指令碼有效性的驗證後,這筆交易才會被記錄到鏈上賬本中。此時也意味著我完成了乙個接收+花費位元幣的典型場景。
此時,輸出tx_1_out_1
由於被 tx_2 中的輸入成功使用,會被系統被標記為已花出。如果嘗試利用它再次構建交易,會被礦工認定為「雙花」從而拒絕。與之相對,輸出tx_2_out_1
由於尚未被任何輸入使用,故被稱為未花費輸出(即 utxo)。
所以我們可以這樣比喻位元幣的流**每乙個輸入指向了前乙個交易輸出,當且僅當它能提供合適的「鑰匙」開啟前乙個輸出上的「鎖」時,才能移動其中包含的位元幣到新的輸出。誰擁有輸出的這個「鑰匙」,誰就擁有其中的位元幣。
實際上,位元幣底層使用一種名為 script 的指令碼語言來實現「鎖」和「鑰匙」,它是一種基於棧的指令碼語言。簡單來說,它是一串由操作碼(opcode)組成的指令集合,下面是幾個簡單的操作碼例子:(完整的操作碼列表請參考這裡)
操作碼描述
op_2
將數值2
推至棧頂
op_add
將棧頂的兩個元素數值相加
op_equal
如果棧頂上2個元素相等,則返回true
;否則返回false
鎖定指令碼(位於前乙個交易的輸出中)和解鎖指令碼(位於當前交易的輸入中)都是由其中一些操作碼串聯組成,每個操作碼後面可以有零至兩個操作子。
為了驗證解鎖指令碼的有效性,位元幣虛擬機器(bvm)被引入位元幣節點。bvm 將鎖定指令碼連線在解鎖指令碼的後面,從而形成完整的執行指令碼。這個完整的指令碼會被 bvm 執行。當執行完畢後,如果棧頂元素的布林值為true
(即數值非零),則認為指令碼執行成功,反之其他情況則認為指令碼執行失敗。
我們來看個例子。假設在乙個交易中,一些位元幣被使用以下指令碼鎖定在輸出中:
op_1 op_2 op_add op_equal
在另外乙個試圖花費這個輸出的交易中,使用以下指令碼:
op_3
為了說明這裡的解鎖授權是如何進行的,我們來分步模擬一下指令碼的執行過程。
最終結束時留在棧頂上的唯一值為true
,這說明整個指令碼執行成功。如果使用任何不是3
的值作為解鎖指令碼,則整個指令碼的執行結果必然為false
,意味著無法成功解鎖。
正如前面這個指令碼例子所展示的那樣,對於乙個特定的鎖定指令碼,只有特定的解鎖指令碼與之連線後,才能使得整體的執行結果為true
。從這個意義上講,任何花費位元幣的行為都可以看做是乙個合約:其中一方提供一定數量的位元幣並且約定好條款;另一方只能在提供滿足這些條款的證據時,才能花費合約中被鎖定的位元幣。之所以稱之為「智慧型」合約,也是因為它僅需要由位元幣網路礦工來自動確認和執行。
位元幣入門
1.全節點客戶端,即儲存位元幣交易的全部歷史的客戶端。完整節點處理協議的所有方面,並可以獨立地驗證整個區塊鏈和任何交易。需要消耗大量的計算機資源。2.輕量級客戶端,連線到位元幣完整節點,用於訪問位元幣交易資訊,但是在本地儲存使用者錢包,並獨立地建立,驗證和傳輸交易。3.第三方 api 客戶端,通過應...
智慧型合約入門
智慧型合約也稱為 自執行和約 或者叫 化的合約 這個小節裡面我們不聊智慧型合約的社會意義,而是假設你是一位開發者,準備上手智慧型合約的開發,那麼動手之前都有哪些基礎知識是必備的呢?本文為你呈現。智慧型合約的概念於 1994 年由 nick szabo 首次提出。廣義上來講,任何的能自動完成的合同就是...
智慧型合約入門
先從乙個非常基礎的例子開始 123 4567 891011 12 contract zhaoxistorage function get constant returns uint retval 在solidity中,乙個合約由一組 合約的函式 和資料 合約的狀態 組成。合約位於以太坊區塊鏈上的乙個...