比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads

區塊鏈技術7:比特幣的機制(1)_SIG

Author:

Time:1900/1/1 0:00:00

在之前的課程中我們從較高的層次討論比特幣,它為什么會出現,它的正確性的保障,從這一節開始,我們會討論比特幣的細節。

比特幣的共識機制生成了一個append-only的賬本,一旦交易在賬本中,再也不能更改。礦工——也即一些有較高計算力的節點,生成區塊,并且驗證交易是正確的等。賬本和區塊鏈網絡使得比特幣成為一種貨幣。在本文中,將介紹一些細節。

交易

區塊鏈實際上就是一個賬本,賬本就是要記賬,賬實際就是一筆筆的交易。那首先看一下,使用下面的記賬形式效果如何。

第一個交易是形成區塊的獎勵25個比特幣。Alice將17個幣轉給Bob,Bob轉8個給Carol,Carol轉5個給Alice,然后Alice轉15個給David。這種記賬方式非常符合我們的直覺,因為現實生活中,支付寶、微信、銀聯都是這么做的。但是這種做法的優缺點是什么?

上面的例子中,前面的幾筆交易我們可能都看的很順,因為根據之前交易的情況,我們很容易判斷出交易能夠順利進行。但是看到最后一筆交易的時候就得想一下,Alice有這么多錢支付給David嗎?

這種形式的賬本也叫作account-based賬本,這種記賬方式的問題是:必須對每個賬戶的余額進行查詢,才能確定一筆交易是否有效。譬如在最后一個交易的時候,得去查一下Alice的賬戶,總共還有多少幣剩余。像上面的例子中,如果沒有全局的數據結構維護用戶的余額,那么可能得一路追蹤回去到起始交易,看看Alice到底剩多少錢。如果想要快一點,那就得額外地維護數據結構,譬如有一個全局的數據結構,在每次交易后更新賬戶余額。

由于這樣的問題,比特幣并沒有使用這樣account-based的記賬方法。比特幣的記賬方式是類似于這樣的:

每一筆交易指明了輸入和輸出,每一筆交易有唯一的標識符,每一筆交易可以有多個輸入和多個輸出。上面的例子做了簡化,使得可以方便地使用序號來指代交易。

毛球科技集團助力四川省德陽智慧農業發展 將基于區塊鏈打造全新平臺:2020年11月25日,四川省德陽市新型農業農村人士聯誼會成立大會在德陽市漢瑞酒店舉行。大會上毛球科技集團聯合中國農業銀行德陽分行與德陽市新型農業農村人士聯誼會簽署戰略合作協議,共同打造智慧農業平臺為產業賦能。

據介紹,此次合作將基于區塊鏈技術打造全新“智慧農業”平臺,充分應用傳感器、大數據、云計算、區塊鏈等前沿技術,構建成集新興的互聯網、移動互聯網、云計算和物聯網技術為一體,依托部署在農業生產場地的各種傳感器和通信網絡實現農業生產環境的智能感知、預警、分析,為農業生產提供精準化、可視化、智能化的管理與決策。

目前,三方已正式簽署總計10億元人民幣的授信合作協議,共同打造四川省智慧農業建設。據介紹,未來該智慧農業平臺將圍繞智慧農業工廠、智慧農業示范基地、智慧農業云平臺(環境監測、農產品溯源),通過精準化定位、可視化管理、智能化決策,共建智慧農業。[2020/11/27 22:18:39]

第一個交易中沒有輸入,因為它是區塊的第一個交易,創造了新的幣,Alice作為礦工獲得了幣,這25個幣也是交易1的唯一一個輸出,在之后使用1來指代Alice擁有的25個幣。在第二個交易中,輸入是1,25個幣,然后產生了兩個輸出,2是支付給Bob的17個幣,2是剩下的8個幣,也形成了一個輸出,接收方是Alice自己。在第三個交易中輸入是2,也即Bob的17個幣,輸出是3,付給Carol的8個幣,以及3,付給Bob的9個幣。在第四個交易中,輸入是2,也即Alice的8個幣,分別支付給David和Alice。

使用這樣的記賬方式的好處是可以方便地驗證交易的正確性。在驗證一個交易時,我們首先找到輸入所指向的交易的輸出,同時為了確保它并沒有被花掉,所以我們需要掃描所指向的交易區塊和最新區塊之間所有的區塊,而不需要找到創世區塊。

因為一個交易可以包括多個輸入和多個輸出,所以可以方便地實現各種目的。譬如,Bob接收到Alice的8個幣,收到Carol的2個幣,那么Bob可以將創建一個新的交易,將兩個交易中的輸出作為輸入,從而將零錢合并為整錢。

懷俄明區塊鏈委員會創始人:該州對比特幣的支持程度領先于紐約:懷俄明區塊鏈委員會創始人Caitlin Long今日在節目中表示,該州對比特幣的支持程度遙遙領先于紐約。

Long還表示,未來比特幣可能會達到100萬美元,這將給比特幣所有者和金融機構帶來新的法律問題。(Cointelegraph)[2020/6/7]

如果Bob和Carol要同時支付給David,那么在同一個交易中的輸入可以包含Bob和Carol的幣。在這種情況下,交易生效的條件同時需要Bob和Carol兩人的簽名。

2.?交易的語法

上面從概念上簡單介紹了交易。接下來看一些細節——下面的圖雖然一眼看上去有點復雜,但是已經是經過翻譯之后的友好版本,畢竟所有在網絡上傳輸的數據都是01串。

如上圖所示,交易由三部分構成:元數據、輸入和輸出。

元數據:顧名思義,元數據記錄交易的基本信息,如交易的大小,交易的輸入個數Vinsz,交易的輸出個數Voutsz,以及整個交易的哈希值作為交易的唯一的ID。如果看的仔細,還能發現有一個lock_time,鎖定時間,在后面會有具體的例子來介紹它的用法。

輸入:交易的輸入構成一個數組,多個輸入中每一個結構都一樣。因為它指定了之前的一個交易的輸出,所以需要包含之前的交易的哈希值,同時指出該輸入是之前交易的第幾個輸出。除此之外,每個輸入還必須包括一個簽名,這個簽名就是一個憑證,證明交易的創建者確實有使用這個輸出的權利。

輸出:輸出同樣構成一個數組。每個輸出有兩個部分,value值和scriptPubkey。所有輸出的value的和不能大于所有輸入值的和。如果所有輸出的和小于所有輸入和,那么差值部分就成為礦工的交易費用。

現在可能有個疑問,本來是簽名和公鑰地址的位置出現的是scriptSig和scriptPubKey,而不是簡單的Signature和PubKey。而且在scriptPubkey的地方,有一些奇怪的符號如OP_DUP,OP_Hash等。這就是接下來要介紹的比特幣腳本,Bitcoinscript。

金色晨訊 | 支付寶實現移動端區塊鏈跨境匯款服務 百度超級鏈55000TPS遠超行業水平:1.ONTology已在谷歌云、Amazon Web和微軟Azure發布公鏈。

2.日本三菱研究院利用區塊鏈技術提高食品溯源效率。

3.易見股份利用華為云搭建“易見區塊2.0”系統部署環境。

4.支付寶已在移動端實現區塊鏈跨境匯款服務。

5.富達接過比特幣閃電“火炬” 將推出比特幣托管服務。

6.海南省知識產權局與恒生電子合作引入區塊鏈技術。

7.以太坊兩個升級命名為君士坦丁堡/圣彼得堡 刪除改進提案EIP1283。

8.百度Q4財報:超級鏈55000TPS遠超行業水平。

9.Ken Rogoff:未來中央機構或會通過一個準入系統操作數字貨幣。[2019/2/24]

3.?比特幣腳本

如上小節所見,在交易中出現了一些如OP_DUP的符號,這實際上是一種腳本。本小節將介紹比特幣腳本語言,以及為何需要使用比特幣腳本。

比特幣腳本是基于棧的語言。棧允許兩類操作:入棧和出棧。入棧是在棧頂部增加一個項目,出棧則是從棧頂部移除一個項目。腳本語言通過從左至右地處理每個項目的方式執行腳本。數字指令直接入棧,操作指令向堆棧推送一個或多個參數,對它們進行處理,或者可以將結果入棧。例如,OP_ADD將從堆棧移除兩個項目,將二者相加,然后再將二者相加之和推送到堆棧。

腳本的一個重要作用就是判斷是否滿足條件,譬如OP_EQUAL判斷棧中的兩個值是否相等,如果相等則將棧上的兩個值出棧,入棧TRUE。如果最后棧的結果為TRUE,則條件滿足。舉一個非常簡單的例子,譬如Alice將自己的10個幣寫在一個交易中,然后輸出的條件是

3OP_ADD5OP_EQUAL

之后如果有人能夠給出滿足這個條件的結果,也即最后的OP_EQUAL返回的結果是TRUE,那么則可以使用這10個幣。

那么大家看一下,以上問題的結果應該是什么?

動態 | 廣州互聯網法院將于2月上線司法區塊鏈平臺:據廣州日報報道,1月8日是廣州互聯網法院掛牌成立的第一百天。據悉,廣州互聯網法院成立100天以來,立案1861件,審結951件,首批13名員額法官人均結案73件。預計今年2月中旬,廣州互聯網法院將上線司法區塊鏈平臺,解決電子證據取證難題。[2019/1/10]

最常見的一種比特幣交易應該就是通過簽名獲取之前交易的比特幣輸出。也即輸出中應該指明“這一筆輸出應該由這個公鑰址所對應的私鑰的擁有者使用。”但是回想一下,比特幣中,交易地址實際上是公鑰的哈希,而不是真正的公鑰。因此,礦工并不知道公鑰,從而也無法來驗證簽名。為了進行驗證,每一個輸出實際上指明的是“這一筆輸出可以由哈希為x的公鑰,以及公鑰對應的私鑰的所有者使用。”

為了表達這個含義,來看一下交易中的輸出:

Pay-to-PubkeyHash腳本的例子

顧名思義,OP_DUP是duplicate復制,OPHASH160是進行哈希,69e0....串是指定的地址,OP_EQUALVERIFY是驗證是否相等,以及OP_CHECKSIG是進行簽名驗證。

那現在的問題是,第一個OP_DUP是用來復制什么呢?

答案就是,每一個交易的輸入部分的scriptSig也是腳本。為了成功地使用之前交易的輸出,我們需要將新交易的輸入與之前交易的輸出進行合并,然后執行合并之后的腳本,如果驗證成功,則該交易是合法的;否則,這個交易就是無效的。

新交易的輸入簽名之前所引用交易的輸出

比特幣腳本簡稱就是Script,它是一種簡單的基于棧的編程語言。基于棧意味著每個指令以線性的方式僅僅執行一遍。特別地,比特幣腳本中沒有循環。因此,腳本的指令的數量就暗示了執行腳本的時間和所用的內存的上限。該語言不是圖靈完備的,也即不能執行任意復雜的操作。這也是合理的,因為礦工需要驗證交易,也即礦工需要執行這些腳本,如果腳本中出現了死循環,礦工就被坑了。

聲音 | 騰訊李茂材:區塊鏈技術發展進入瓶頸期:據星球日報,騰訊區塊鏈技術總經理李茂材表示,區塊鏈更適合“需要透明化”的場景,比如電子處方的權責確認,游戲規則和操作痕跡上鏈防止游戲中的暗箱操作等。很難預測殺手級應用和爆發場景,但大公司做to B會更有優勢。區塊鏈技術發展進入瓶頸期。區塊鏈不能解決所有問題,區塊鏈的多副本等特性會帶來高成本,這對中小企業壓力較大。[2018/10/31]

交易的執行結果要么就是成功的,也即交易是合法的,可以被包括在區塊鏈中;要么就是失敗,也即交易是無效的,不能被包括在區塊鏈中。

比特幣腳本語言非常小,總共只有256個指令,因為每個指令使用一個字節來表示。其中,有15個指令現在已經禁用;75個預留的,有可能將來添加。大部分的指令是在普通的編程語言中見到的,有一些是和密碼學相關的,如哈希,簽名驗證等。

下面使用一個例子來講述如何運行腳本。

首先來具體看一下scriptSig的樣子。下面是一個例子。

8c4930460221009e0339f72c793a89e664a8a932df073962a3f84eda0bd9e02084a6a9567f75aa022100bd9cbaca2e5ec195751efdfac164b76250b1e21302e51ca86dd7ebd7020cdc0601410450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6

它實際上是由四個部分構成:

|<TheactualDER-encodedsignatureplustheone-bytehashcodetype>|<One-bytescriptOPCODEcontainingthelengthofthepublickey>|

8c:一個字節指示整個簽名的長度,共120字節

49:一個字節指示實際簽名的長度加上一個字節的哈希類型SIGHASH_ALL,共73字節;73=721

簽名:30460221009e0339f72c793a89e664a8a932df073962a3f84eda0bd9e02084a6a9567f75aa022100bd9cbaca2e5ec195751efdfac164b76250b1e21302e51ca86dd7ebd7020cdc06,然后緊跟著01,sighash類型

41:一個字節指示公鑰的長度,共65字節

公鑰:0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6

也即,從新交易的scriptSig中可以獲得對應著下圖中的第一部分和第二部分。

下圖實際上是從左向右逐步執行腳本中每一個指令的過程。上部是棧的變化,下部分是執行的具體指令。

sig和pubKey是兩條數據指令,當遇到數據指令時,直接入棧;所以將新交易的輸入中的scriptSig部分中的簽名部分和公鑰部分入棧。后面五條指令中除pubKeyHash外都是操作指令,基于棧的語言從棧頂獲得輸入,然后將結果入棧。所以第一條Dup復制指令直接把pubkey復制了一份;Hash160指令對pubkey進行哈希,將結果入棧;然后然后接下來是數據指令將新交易所引用的交易的輸出中的公鑰哈希入棧,然后是比較指令,比較棧頂的兩個元素是否相等,如果相等彈出,如果不等則報錯。最后是checksig,使用publickey來驗證簽名。如果驗證成功,那么棧頂的兩個元素出棧,然后結果True入棧。

現在我們用一個例子再詳細地過一遍這個過程。之前的交易Tx1,也即新交易中的輸入的來源,我們假設是Alice支付給Bob的交易;新交易Tx2,也即Bob需要使用他在Tx1中獲得的幣。

為了驗證這個交易的合法性,礦工要能夠驗證Bob確實可以使用Tx1中的輸出。如何證明呢?首先就是因為Alice在Tx1交易中的scriptPubKey中,明確指定了一個哈希地址,這個哈希地址就是Bob的公鑰的哈希。Bob為了證明自己就是這筆輸出的合法主人,他必須提供身份信息,也即,在Tx2的輸入部分的scriptSig中他提供了簽名和完整的公鑰,簽名是使用私鑰對交易的簽名。

然后礦工開始執行驗證過程。礦工將Tx2的scriptSig部分和Tx1的scriptPubKey部分簡單的拼在一起,然后執行每一條指令。

首先是指令,這是數據指令,是來自于Bob的簽名,也即Tx2的中scriptSig的第一部分,入棧。

接下來是,同樣是數據指令,是來自于Bob的完整公鑰,也即Tx2的中scriptSig的第二部分,入棧。

第三條指令是OP_DUP,這是來自Tx1的Alice的輸出的scriptPubKey,OP_DUP添加到堆棧,因為是復制,所以用下面的數據把自己替換掉,這樣把BOB提供的公鑰復制了一份。

第四個指令是OP_HASH160,入棧,對下面的數據,也即Bob的公鑰進行兩次哈希,把自己替換掉。這樣就獲得了Bob公鑰的哈希值。

第五條指令是數據指令,,同樣來自于交易Tx1,Alice指定的的輸出地址,入棧。這樣棧頂就有兩份哈希值了。

下一條指令稍微復雜點,OP_EQUALVERIFY,入棧,相當于展開成EQUAL和VERIFY兩個操作。EQUAL的操作是檢查它下面的兩個值是否相等,這里,也即檢查Alice指定的地址和Bob提供的完整公鑰生成的哈希是否相等。EQUAL會得到0(false)或者1(true),然后使用這個值把替換自己。VERIFY檢查EQUAL的返回值,如果是false,則交易非法,如果是true,則將自己和true出棧。這里,是為true的情況。

最后一條指令是OP_CHECKSIG入棧,對棧中的兩個元素進行檢查,當前棧中的數據實際就是Bob的輸入中提供的完整公鑰和對應私鑰的簽名,如果驗證通過則True入棧。

以上就是一個正確的Pay-to-PubKeyHash的例子。

另外要注意一點細節就是如何使用公鑰來驗證簽名。也即,這個簽名是怎么產生的?簽名是對什么的簽名?我們知道簽名實際上就是使用私鑰對一段明文進行加密,那這里的明文是什么?這里的問題是,首先,這段明文是礦工能夠訪問的,不然無法驗證;其次,這段明文必須是唯一的,不然Bob之前的簽名可能被攻擊者復制進行重放。

這里答案就是整個交易Tx2。

確切地說,就是交易Tx2的除了簽名部分之外的內容。上圖共有三個部分,中間是SignedData,也即被簽名的數據。上部是Tx1和Bob自己的數據,下部分是Bob最終形成的Tx2。從上部分和中間部分形成了下部。

更多細節可以參考HowtoredeemabasicTx?

以及OP_CHECKSIG-BitcoinWiki

最后,有兩個個問題可以討論一下:

1.在驗證過程中,最后一步OP_CHECKSIG的輸入實際上就是在新交易中Bob提供的scriptSig的兩個部分,最后一步的驗證也就是在驗證Bob的私鑰。那中間還有那么多步驟能不能省略呢?

2.在引入比特幣地址之前,早期的比特幣版本支持p2pk形式的交易,也即pay-to-public-key。這種交易的缺點是需要提前知道公鑰,而且針對攻擊的保護性較差。問題是:這種交易的scriptSig和scriptPubKey應該怎么寫?

參考:

深入理解比特幣交易的腳本-新手入門

2.?https://bitcoin.org/en/developer-guide#transactions

3.Transaction-BitcoinWiki

Tags:BOB比特幣SIGLICbob波幣錢包官網比特幣全球市值占比SignataMy Neighbor Alice

比特幣價格今日行情
SOG活動結束公告_Solana

SOG活動結束公告 2019-09-20 親愛的用戶: DragonEx已完成SOG超級交易大賽活動,獎勵已發放完畢,獲獎用戶可至「我的資產—賬單」進行查看.

1900/1/1 0:00:00
BKEX Global 關于下架SCM/USDT交易對的公告_BAL

親愛的BKEXer: 本著保護用戶的宗旨,BKEXGlobal為保證交易幣種的高標準,將定期對平臺內的代幣進行綜合性審查;如項目方出現對投資者不利因素,我們將采取對應措施,并下架對應項目.

1900/1/1 0:00:00
風險提示_數字貨幣

第一條數字貨幣交易有極高的風險,參與數字貨幣交易,用戶應當自行控制風險,評估數字貨幣投資價值和投資風險,承擔損失全部投資的經濟風險.

1900/1/1 0:00:00
DeFi生態詳解:頭部DeFi項目去中心化屬性對比_ETH

摘要:去中心化金融協議業務與傳統業務的不同之處。幾乎每一個加密初創企業的支持者都有一種趨勢,那就是利用區塊鏈技術的去中心化價值,兜售自己的商業基本面.

1900/1/1 0:00:00
GoStaking即將上線,多家知名機構宣布參選首批節點_LGO

9月18日,GoStaking將于近日正式上線。GoStaking是一家專注于Staking經濟服務的數字資產管理平臺.

1900/1/1 0:00:00
數據顯示:比特幣震蕩企穩_加密貨幣

北京時間9月23日8點,反映加密貨幣市場整體走勢的ChaiNext100指數報887.55點,過去24小時下跌0.38%,成交額312.88億美元,成交較前24小時減少1.65%.

1900/1/1 0:00:00
ads