1. 程式人生 > >區塊鏈-第三章 比特幣的執行機制-普林斯頓大學課程

區塊鏈-第三章 比特幣的執行機制-普林斯頓大學課程

3.1比特幣的交易

把愛麗絲賬戶裡17個幣轉給鮑勃:

交易1是鑄造新幣的交易,沒有輸入,只有輸出。交易1的輸出是向愛麗絲轉移25個幣。現在,愛麗絲想把一些幣轉個鮑勃,她就創造了一條新的交易,在交易中她必須明確指出要轉出的幣的來源(引用之前某筆交易),在這次的交易中,愛麗絲要明確收款人——輸出的地址,在這個例子中,有兩個輸出,一個是轉17個幣給鮑勃,另一個是轉8個幣給愛麗絲自己。


從上圖中可以看到,一個比特幣交易分成三部分:元資料,一系列的輸入和一系列的輸出

元資料:這裡存放一些內部處理的資訊:包含這筆交易的規模,輸入的數量,輸出的數量,還有此筆交易的雜湊值,也就是這個交易讀一無二的ID。我們可以用雜湊指標指向這個ID。最後還有一個“鎖定時間”超時則交易不成立。

輸入:所有輸入排成一個序列,每個輸入的格式是一樣的。輸入需要說明之前一筆交易的某個輸出,因此它包括之前那筆交易的雜湊值, 使其成為指向那個特定交易的雜湊指標。這個輸入部分同時包括之前交易輸出的索引和一個簽名:我們必須有簽名來證明我們有資格去支配這筆比特幣。

輸出:所有輸出排成一個序列。每個輸出的內容分成兩部分。所有輸出的金額之和必須小於或等於輸入的金額之和。當輸出的總金額小於輸入金額時,輸出的總金額與輸入的總金額的差額部分,就作為交易費支付給為這筆交易記錄的礦工。每個輸出都要和一個特定的公鑰(地址)對應。

3.2比特幣的指令碼

每個交易輸出不僅確定來一個公鑰,同時指定一個指令碼。指令碼一個是輸入指令碼,一個是輸出指令碼。



一個簡單的指令碼的例子:


       指令碼的前兩條指令屬於資料指令,分別是輸入指令碼(包含在交易的輸入項)中的簽名和用來驗證簽名的公鑰。一看到資料指令,系統就把它堆到堆疊最上面。首先,我們複製指令OP_DUP,這一步僅僅是將堆疊最上面的公鑰複製,並置於堆疊最上層,下一個指令是OP_HASH160。該指令取得堆疊最上層的資料,並計算其雜湊值,然後將結果再堆到堆疊最上層。當指令執行完成後,我們將堆疊最上層的公鑰替換成公鑰的雜湊值。


 接下來,我們還要在對戰頂層再推送一些資料:此筆交易傳送者指定的公鑰的雜湊值,以及對應的私鑰,這樣才可完成簽名,取得資金。此時,堆疊頂部有兩個數值,一個是傳送者指定的公鑰的雜湊值,另一個是接受者想要取得資金時提交公鑰的雜湊值。

 這個時候,我們就要執行EQUALVERIFY命令了,這個命令是用來檢查堆疊頂部的兩個數值是否相等。如果不相等,就會丟擲一個失敗訊號,並且停止執行指令碼。假設其相等,也就代表著接收者使用的是正確的公鑰。這條指令會移除堆疊頂部的兩條資料,

時,堆疊還剩下兩個資料:公鑰以及簽名。


我們已經證實接收者使用的公鑰確實是交易裡指定的公鑰,但是現在我們要證明簽名是真的。這時,使用OP_CHECKSIC指令。

移除堆疊裡兩個數值,然後用公鑰來證實整個交易的簽名是真的。

3.3 比特幣指令碼的應用

第三方交付交易:網上購物可以用第三方支付交易。第三方支付交易可以用“MULTISIC"(多重簽名)來實現。愛麗絲並不直接付款

給鮑勃,而是發起一個多重簽名的交易,並規定:三個人中有兩個人簽名之後,資金才能被支取。這三個人是愛麗絲,鮑勃與第三方

仲裁員。

區塊鏈中一個出名的應用是智慧合約,可以用技術手段強制執行合約。

3.4比特幣的區塊

比特幣的區塊鏈結構:

一個是把區塊鏈聯結在一起的雜湊鏈,另一個就是區塊內部的交易雜湊值梅克爾樹


區塊頭部的雜湊函式必須以一大堆零開頭才有效,區塊頭部還要包括一個礦工可以修改的“臨時隨機數”,一個時間戳和一個

點數(點數用來表示找到這個區塊的難度)區塊頭部是在挖礦過程中唯一雜湊值化的,所以要驗證一個區塊的鏈,只要檢查區

塊的頭部即可。在區塊頭部唯一的交易資料是交易樹的樹根mrkl_root


每個區塊的梅克爾樹上有一個特殊的交易——幣基交易(造幣)

1.4年減半(獎勵在每產生210000),目前為12.5個比特幣

2.平均每10分鐘產生一個區塊,每產生2016個區塊(2周)挖礦難度會改變

3.不存在“1比特幣”這樣的東西,最小的價值是0.00000001BTC(一箇中本聰)


200913日,比特幣的創始人中本聰在創世區塊裡留下一句永不可修改的話(coinbase中):“TheTimes 03/Jan/2009 Chancellor on brink of second bailout for banks200913日,財政大臣正處於實施第二輪銀行緊急援助的邊緣)。”當時正是英國的財政大臣達林被迫考慮第二次出手紓解銀行危機的時刻,這句話是泰晤士報當天的頭版文章標題。

因此我們可以在coinbase中存放資訊,用於未來的檢測,因為它是無法更改的。

3.5比特幣網路

比特幣執行機制:

1)新的交易向全網進行廣播;

2)每一個節點都將收到的交易資訊納入一個區塊中;

3)每個節點都嘗試在自己的區塊中找到一個具有足夠難度的工作量證明;

4)當一個節點找到了一個工作量證明,它就向全網進行廣播;

5)當且僅當包含在該區塊中的所有交易都是有效的且之前未存在過的,其他節點才認同該區塊的有效性;

6)其他節點表示他們接受該區塊,而表示接受的方法,則是在跟隨該區塊的末尾,製造新的區塊以延長該鏈條,而將被接受區塊的隨機雜湊值視為先於新區快的隨機雜湊值。

節點始終都將最長的鏈條視為正確的鏈條,並持續工作和延長它。

比特幣網路是一個點對點網路。在比特幣網路中,所有的節點都是平等的,沒有等級,也沒有特殊的節點,或所謂的主節點。它執行在TCP網路中,有一個隨意的拓撲結構,每個節點和其它的隨機節點相連。新的節點也可以隨時加入。只要一個節點有三個小時沒有音訊,就會慢慢被其他節點忘記。加入比特幣網路是為了維護區塊鏈,當我們發起一個交易的時候,要用”泛洪“的演算法讓整個網路知道,會有相應的機制防止其在網路中迴圈傳播,浪費網路資源。

節點接收到一個新交易資訊時,檢驗有四個關卡:第一個也是最重要的一個是交易驗證,也就是驗證交易在當前的區塊鏈中是有效的,節點會針對每個前序交易的輸出執行核驗指令碼,確保指令碼的返回值都為真;第二,檢查是否有雙重支付;第三,節點會檢查這筆交易資訊是不是已經被本節點接收過;第四,節點只會接收和傳遞在白名單上的標準指令碼。

校驗區塊的過程更加複雜,除了確認區塊頭部,確定裡面的雜湊值是在可接受的範圍內,節點還必須確認區塊裡的每個交易。最後,一個節點往外傳播的區塊必須是最長的一條區塊鏈上心加入的區塊,只有這樣才能防止區塊鏈分叉。

簡單付款驗證(SPV

在不執行完整網路節點的情況下,也能夠對支付進行檢驗。一個使用者需要保留最長的工作量證明鏈條的區塊頭的拷貝,它可以不斷向網路發起詢問,直到它確信自己擁有最長的鏈條,並能夠通過merkle的分支通向它被加上時間戳並納入區塊的那次交易。節點想要自行檢驗該交易的有效性原本是不可能的,但通過追溯到鏈條的某個位置,它就能看到某個節點曾經接受過它,並且於其後追加的區塊也進一步證明全網曾經接受了它。(節點都是誠實的情況下)


3.6限制與優化

我們無法更改比特幣的總體數量與記賬獎勵(更改的話變化太大),但是可以更改比特幣的交易能力。修訂比特幣的協議可能會造成硬分叉和軟分叉。硬分叉是指通過修訂協議引入新的特性,可能會使前一版本的協議失效。即執行新版本協議的節點認為有效的區塊,會被執行舊版協議的節點認定為無效,而不是所有的節點都會更新新的協議,老節點會認為其它的分支(在這個分支中,所有的新節點認為有效的區塊都會被排除在外)才是最長,最有效的區塊鏈分支,並一直擴充套件這個分支,直到它們更新了版本。軟分支是指在修訂中加入新的特性,讓現有的驗核規則更加嚴格。在這種情況下,老的節點依然會接收所有的區塊,而新的節點會拒絕一些。這可以避免硬分叉所造成的永久分裂。執行新版協議的節點會使用一些更嚴格的規則。現在,假設絕大部分節點都會更新了新版協議並執行新的規則(這是軟分叉的關鍵,因為老節點不會執行新規則,新節點的數量足夠多才能夠競爭最長的鏈)。這種情況下,老節點可能會挖到一些無效的區塊——因為這些區塊中包含一些在新規則下無法核驗通過的交易,然後,老節點會知道它們核驗有效的區塊不被別的節點接收,這使得老節點的礦工會去更新協議。而且,如果老節點用它們的區塊擴充套件了老節點的分支,那麼,老節點也會轉而擴充套件這個分支,因為是新節點驗核通過的區塊,老節點也必定能驗核通過。