區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

NO IMAGE
  • 三個最底層的技術
    • 數據關係加密化
    • 數據不可篡改
    • 點對點網絡讓數據永不下線
  • 核心技術概念
    • 區塊
    • 挖礦和共識機制
    • Merkle Tree
  • 區塊鏈適合什麼不適合什麼?
  • 區塊鏈應用
    • 交易模型
    • 身份認證體系
    • 智能合約
  • 結語

最近一直在研究區塊鏈,算是從以前聽說過,到現在大概瞭解一些。先說下自己學習過程中的感受,那就是“幹!能不能把話說明白些。”大部分學習材料都存在結構混亂,或者對一個點單薄,無法深入淺出。至於那些還在拿著露天麥喊什麼是區塊鏈,錯過後悔一輩子的,都是騙子。

我相信現在很多投資機構都在瞄區塊鏈,今年,即使AI也沒有區塊鏈這麼火爆。那麼對於一個區塊鏈項目,到底靠不靠譜,是在畫餅,還是真的可能搞成,所有人都應該擦亮眼睛。

三個最底層的技術

談區塊鏈最好先拋開各種幣的價格,價格這種事你懂的,貴和便宜根本不是人能控制的。但是基於區塊鏈技術去做項目,卻是實實在在可以可持續發展。所以,瞭解區塊鏈技術比炒幣來的實在。

“區塊鏈”三個字並不能闡明這項技術的全部,如果要非要用可以完整表達的命名,我覺得應該叫“Peer-to-Peer Encrypted Non-Tampered Database”,即“點對點的加密化不可篡改數據庫”。

它不一個數據庫(比如MySQL,MongoDB),也不是一類數據庫(比如SQL,NoSQL),它是一種數據庫架構,它在數據庫本身的技術上還上升了一層,考慮到數據的可靠性如何保證,以及數據庫服務如何不下線。因此,你不能把它跟普通的某個有名字數據庫拿來類比,甚至,你可以在某一個具體的區塊鏈實現時,使用其他的數據庫來幫助存儲和檢索數據。

數據關係加密化

在我們普通的數據庫中,無論是關係型還是非關係型,我們的不同記錄之間可能存在關係,也可能不存在關係,但在區塊鏈中,一條數據一定和另外一條數據存在聯繫,即使在現實的業務邏輯上沒有聯繫,但是它總是存在於鏈上,無法脫離鏈而存在,總有一條路徑從一個數據出發到達另外一個數據,不信往下讀。

“區塊”表達了區塊鏈裡面數據關係的最終呈現形式,一條記錄,無論它是什麼信息,最終它(或它的檢索信息)都要被放置在一個區塊中。而區塊與區塊之間,是一個“鏈表”的數據關係,會編程的人都知道什麼是鏈表,就是後一個數據中存在指向前一個數據的索引鍵。因此,區塊鏈上的任何兩個數據永遠可以通過這些索引鍵最終連在一起,數據無法逃離這個邏輯。

但是“區塊鏈”這三個字無法闡述這樣的數據結構和普通數據庫結構之間的不同,因為上面描述的的這種鏈表數據結構,用普通的數據庫也可以構建出來,只要你想要的話。

真正的價值在於,區塊鏈用密碼學的原理,現有的加密技術,把這些索引關係進行了層層加密,以至於在保存的數據中,這些索引鍵並沒有那麼明顯,而是需要通過各種計算才能得到。比如區塊在保存一堆交易信息時,採用了merkle樹的方式進行保存,父節點是兩個子節點的double hash得到的結果,而merkle算法確保了交易信息不能被篡改。

我們這裡還不需要知道具體的加密都有什麼用,我們需要了解的是,區塊鏈裡面到處是加密,這是一個顯著的特點。

數據不可篡改

區塊鏈上的數據是不可篡改的,大家都這樣說。但其實,數據是可以改的,只是說改了以後就你自己認,而且被修改數據所在區塊之後的所有區塊都會失效。區塊鏈網絡有一個同步邏輯,整個區塊鏈網絡總是保持所有節點使用最長的鏈,那麼你修改完之後,一聯網同步,修改的東西又會被覆蓋。這是不可篡改的一個方面。

更有意思的是,區塊鏈通過加密校驗,保證了數據存取需要經過嚴格的驗證,而這些驗證幾乎又是不可偽造的,所以也很難篡改。加密並不代表不可篡改,但不可篡改是通過加密以及經濟學原理搭配實現的。這還有點玄學的味道,一個純技術實現的東西,還要靠理論來維持。但事實就是這樣。這就是傳說中的挖礦。

挖礦過程其實是礦工爭取創建一個區塊的過程,一旦挖到礦,也就代表這個礦工有資格創建新區塊。怎麼算挖到礦呢?通過一系列複雜的加密算法,從0開始到∞,找到一個滿足難度的hash值,得到這個值,就是挖到礦。這個算法過程被稱為“共識機制”,也就是通過什麼形式來決定誰擁有記賬權,共識機制有很多種,區塊鏈採用哪種共識機制最佳,完全是由區塊鏈的實際目的結合經濟學道理來選擇。

挖完礦沒完,拿比特幣來說,接下來礦工要把被廣播到網絡中的交易打包到這個區塊裡,一筆交易是不是合法的呢?發起這筆交易的人是不是偽造了一筆交易?要確保一筆交易的合法性,必須從已經存在的前面的區塊裡面去找到這筆交易的來源的真實性,而如何驗證交易真實性呢?在前面的區塊裡,保存著交易來源的merkle root hash,只要找出這個交易所在的區塊,再做一次merkle校驗,就可以判定交易是否是合法的。得到merkle root hash是通過區塊內的所有交易不斷加密得到的,因此,只要交易是假的,就得不到這個merkle root hash。加密在這裡又幫助實現了數據的可靠性。

除了這些,區塊鏈裡面的加密比比皆是,這些加密規則和算法,使得整個區塊鏈遵循一種規律,讓篡改數據的成本特別高,以至於參與的人對篡改數據都沒有興趣,甚至忌憚。這又是玄學的地方。

點對點網絡讓數據永不下線

如果區塊鏈沒有p2p網絡,僅僅是按照前面的描述,有加密體系,有鏈式特徵,然後運行在某一臺(組)服務器上,按照我們現在中心化的模式運行,看上去也挺好玩的。但是發明者想玩的更大些,加密體系讓數據不可篡改,但是我直接拋顆原子彈把你機房炸掉,不是不可篡改,是直接玩兒完了。

為了防止被原子彈炸掉機房,發明者設計了點對點的網絡(客戶端和客戶端直接通信,不經過某一臺特定的服務器)到區塊鏈裡面。簡單說就是在這個點對點網絡裡面,所有人的電腦裡保管著一模一樣的一個數據結構(其實就是一個完整的“區塊”“鏈”),他們相互通過網絡連接,進行同步,當礦工創建了新的區塊,其他人就會把這個區塊同步到自己保管的數據結構中。因此,無論這個網絡上哪一個節點被炸,其他節點都還活著,新加入的小夥伴就可以從這些節點裡同步數據到自己的電腦。想要讓區塊鏈數據消失,那把地球炸了吧。

而這種加入點對點網絡的設計,就叫“去中心化”,只要網絡上還有一個節點活著,區塊鏈的數據就不會消失。

更讓政客們害怕的是,這些保存的數據,節點上的用戶可以隨便看,無所謂,完全公開。節點用戶既然把數據同步過來了,你就可以隨便用,就是你的數據了,想怎麼用就怎麼用。試想一下,哪天淘寶說我要把自己的數據區塊鏈化……目不忍視……

核心技術概念

前面僅僅闡述的是區塊鏈之所以是區塊鏈的基礎。本節要講的是,現在已經有區塊鏈在你面前了,我們需要去剖析區塊鏈裡面所使用的具體技術點或架構。

區塊

前面已經提到區塊了。那麼到底什麼是區塊呢?區塊是區塊鏈的主要數據存儲結構,一個區塊包含區塊頭和區塊體兩個部分。而區塊頭則是區塊的重頭戲。

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

區塊鏈中的一個區塊結構示意圖(注:漏掉了version信息)

對於一個區塊而言,它就是一個特殊的數據結構。它的區塊頭包含了一些固定信息:版本(客戶端版本,每次升級客戶端軟件,這個信息就會不一樣),塊高度(其實就是表示這是鏈中的第幾個區塊),塊哈希(這個區塊的hash值,是挖礦得到的),上一個塊的塊哈希(這個字段是重點中的重點,是形成鏈表結構的關鍵),時間戳(區塊創建時間),難度和Nonce(這兩個字段和挖礦有關,後文講挖礦的時候詳細講),merkle root(區塊體的merkle根hash值,後文會簡單介紹merkle樹,詳細會在其他文章講)。除了這些字段,如果做一個自己的區塊鏈,還可以添加一些其他信息到區塊頭中。

區塊體是保存具體內容的位置,在比特幣的區塊鏈中,區塊體保存的是一段時間的交易信息。在其他區塊鏈中,這裡可不一定保存的是交易信息,可能是其他信息,總之區塊體是保存該區塊鏈用來做什麼業務的具體業務信息。

在部分區塊鏈實現中,一個區塊還可以有區塊尾,用來保存一些區塊創建結束之後的信息,這些信息可能是區塊頭和區塊體已經創建完以後,附加上去的,比如區塊的長度、容量等信息。

這就是一個區塊。而一個區塊頭中的previousHash字段,保存的是上一個區塊的hash值,因此,通過這個區塊就知道了上一個區塊是哪個,上一個區塊又能知道上上個區塊,直到可以追溯回整個鏈條的第一個區塊。這就是區塊鏈。

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

區塊是如何構成鏈的的示意圖

就像上圖一樣,後面一個區塊總是指向前一個區塊。一旦一個區塊生成,並且後面有區塊指向它,那它就不能被修改,因為一旦修改,所有的hash都需要重新計算。但是我們知道,hash算法的特點是,想要得到這個hash必須用原始內容進行一遍hash算法,所以,如果給的內容和原始內容不同,是得不到這個hash的,所以,中間某個區塊鏈被修改而得到的hash,不可能被後面的區塊指向,區塊鏈就會斷掉。斷掉的區塊鏈加入到網絡中,要麼不被認可,別的節點不會把你當作合法節點,要麼你要再同步一遍,從網絡中重新複製最長的鏈到你的本機覆蓋原來的鏈。

但是你可能會有兩個疑問:1.這個blockHash又不是內容的hash,怎麼確保區塊體內的信息不被修改呢?要是我不改blockHash,只改內容,那不是可以瞞天過海?2.如果有兩個區塊同時指向了一個區塊,而這兩個區塊的區塊體不一樣,這該怎麼辦?

第一個問題,我們需要通過後面的挖礦和merkle tree兩部分結合,知道這個原理。第二個問題,實際上,這種情況非常常見,挖礦成功的概率其實是100%,關鍵在於哪一位礦工先挖到礦,一般當礦工挖到礦之後,會向全網廣播,其他沒有挖到礦的礦工就會停止。但是由於網絡延時等情況,可能在短時間內多個礦工一起挖到礦,他們都創建了新的區塊,並且廣播到了網絡中。這種情況叫“分叉”。

當分叉發生的時候,有兩種辦法。但都是順其自然,不人工干預。後面挖新塊的礦工,會自己決定把哪一個分支最後的塊作為自己的前一個塊。如果在比較短的塊數內,一條鏈明顯長於另外一條鏈,那麼長的鏈會被保留,短的會被拋棄,挖短鏈的礦工算是白乾了一場。所有的網絡節點在同步的時候,都會選擇當前最長的鏈進行同步,後面挖礦的礦工創建新塊的時候也是選擇最長的鏈。

但是還有一種情況,就是短鏈的礦工不依不饒,或者短時間內兩條鏈無法分出勝負,甚至最後每條鏈都有了很多塊跟在後面。一幫人的轉賬總不能有兩個賬單吧,如果兩個賬單最後發現還不一樣就麻煩了。所以遇到這種情況,礦工們會決定分家。也就是一個區塊鏈變成了兩個鏈,其中一條鏈把前面的所有鏈複製出來,成為獨立的鏈,從此這兩條鏈再無瓜葛,雖然前面的區塊都是一摸一樣的,但是後面井水不犯河水。這種情況叫“硬分叉”,BitCoin Cash就是這樣誕生的。新產生的鏈繼承了前面的區塊,但是後面的區塊完全是挖這條鏈的礦工決定的。硬分叉的好處是,對於原來的用戶而言,突然之間,自己的一份資產變成了兩份😂

至於區塊體,真的是根據區塊鏈應用的業務需求來設計。比如比特幣,就被設計為交易模型,所有區塊體裡面的交易記錄放在一起,就是一個長長的賬單,每一分錢的來龍去脈寫的一清二楚,如果當初紅十字會用區塊鏈來捐款,那就不會有那麼大的風波。但是其他區塊鏈應用不一定是交易模型,比如用於記錄醫療信息的區塊鏈,用於記錄用戶位置的區塊鏈……所以,對於區塊鏈技術本身而言,點到這裡即止,再往下說就是比特幣特有的技術了。

挖礦和共識機制

前面已經多次說了挖礦。簡單說挖礦過程就是一堆礦工在搶創建一個新區塊的權利的過程。在加密貨幣的世界裡,搶到這個權利,就會在這個區塊的最前面加上一筆轉賬給自己的交易,而這個交易的錢是憑空而來的,所以又叫“挖礦獎勵”,而且數額還不少,所以礦工才擠破腦袋搶這一個記賬權。但是在其他非幣區塊鏈應用裡,假如沒有這個獎勵,怎麼激勵礦工挖礦呢?這也是區塊鏈領域裡一個玄而又玄的話題,至今沒有答案。

那麼挖礦挖礦,到底是怎麼一個技術上的算法過程呢?

在礦機程序裡,規定了如何得到一個hash,而這個規定,就被稱為共識機制,所有礦工按照這個共識機制去進行某個算法,看誰先得到一個符合條件的結果,而這個結果又可以被輕而易舉的驗證是符合條件的(驗證是否符合共識機制)。不同的區塊鏈,共識機制不同,目前比較知名的是PoW和PoS,以及在這兩者基礎上衍生出來的其他共識機制。

為了能夠把挖礦過程講清楚,我們只拿比特幣遵循的PoW來進行演示。

SHA256(SHA256(version + prevHash + merkleRoot + time + currentDifficulty + nonce )) < TARGET

礦機執行上面公式,只要滿足上面這個公式(執行結果為真),就算挖到礦。現在對這個公式進行解釋。

  1. 礦機會做一個double sha256的運算,運算的參數其實全部是塊頭裡面的信息,但是因為這個時候區塊還沒有生成,所以這些信息是暫時保存的,如果搶到記賬權,就把這些信息記錄進去
  2. version是當前運行礦機的客戶端軟件版本,每次版本升級,可能對一些參數會有影響,比如區塊大小從1M擴容到2M,但是對於挖礦算法而言是不變的
  3. prevHash是前一個區塊的hash值
  4. merkleRoot是當前礦機內存裡暫存的交易的merkle算法得到的根hash,merkle會在下文講
  5. time是當前時間戳
  6. currentDifficulty是當前難度,這個當前難度是由一個公式算出來的,這個公式是 currentDifficulty = diff_1_target/TARGET 這個公式裡面的diff_1_target可以認為是一個常量,在比特幣客戶端裡面是不變的,值為0x1d00ffff。當然,其實它也有可能變,但怎麼變都差不多這個值,我們還是把它當作常量。而TARGET我們在下面會講到。
  7. nonce是一個正整數,nonce的值就算礦機要找的值。當礦機開始執行double sha256算法時,nonce為0,如果執行完一次,無法滿足上面那個公式,那麼nonce就自加1,再執行一遍算法,如果不滿足公式,繼續加1再執行,就是這樣一直加上去,直到找到一個nonce滿足上面的公式,就算挖到礦。所以,這個nonce每一次挖礦都可能不一樣,它是完全隨機出現的,到底是多少完全看運氣。但不管怎樣,你看每個區塊裡面但nonce值,就知道礦機做了多少次運算,也就知道挖到礦有多難了。
  8. TARGET是用以對比的目標值,它是一個特定值,比特幣的發明者希望10分鐘產生一個區塊,所以最初設計的TARGET就是為了讓currentDifficulty能夠到一個合適的值,保證10分鐘一個塊。但是實際情況並不可能保證10分鐘一定出一個塊,如果算力下降,時間就會加長,這時就應該調整一下難度,使出塊時間儘可能恢復在10分鐘左右。所以2016個區塊(2周)TARGET就會調整一次,而如果真實的情況是產生2016個區塊的時間超過2周,那麼TARGET就會適當增加,從而使currentDifficulty減小,下面2016個區塊的難度就會降低一些。相反,則提高難度。這個調整算法本文就不展開了。所以TARGET是一個2016次不變,但總體而言一直在變的值,它的目標就是讓產生一個區塊的時間大概在10分鐘左右。

這就算比特幣的挖礦,礦工們每天看著自己的機器,反覆不斷的執行這個公式,尋找那個nonce,日復一日,年復一年。

當礦機找到nonce之後,就奪得了記賬權,就可以把內存中的交易信息調出來,打包到區塊體中。而merkle root是通過交易記錄計算得到的,所以不可能礦工在打包時又去做手腳,一旦他偽造了某一條交易,打包進區塊體的交易就不能得到他挖礦時使用的那個merkle root,也就無法得到挖礦時找到的那個hash。

當然了,實際上比特幣挖礦可能還要麻煩一些,比如說還有nonce溢出、礦池……

Merkle Tree

前面說了好多次Merkle,它到底是什麼?Merkle Tree是一種數據結構,比特幣裡面就是一棵二叉樹,也就是每個父節點有兩個子節點那種。我之前寫過一篇文章《區塊鏈如何運用merkle tree驗證交易真實性》裡面詳細講了一些Merkle Tree的原理以及問題。這裡主要還是做一個科普,不深入講。

區塊頭裡面的Merkle Root是怎麼來的呢?它是通過對區塊體內的記錄做Merkle算法得到的。以比特幣為例,一個區塊裡面包含n個交易,我們把這些交易兩兩分組,每兩個一組,得到n/2組,如果有單數,那麼最後一個交易複製一份湊數。先對每個交易做hash提取,這樣就得到來n個hash,然後對每組的hash做double hash運算:

parentHash = sha256(sha256( hash1 + hash2 ))

也就是把這個組裡的兩個hash連起來,再計算得到一個新hash,這個新hash就算這兩個hash的父節點。得到所有組的父節點之後,按照同樣的邏輯,得到父父節點,如此一直下去,最後得到一個根節點,這個根節點就是merkle root。

merkle算法大致是這樣,但它不僅限於區塊鏈領域,在其他任何驗證領域都可能用到,而且也不一定是這裡講的必須兩個得到一個的算法,也可以是任意個得到一個的算法,總之merkle是一種對多個記錄進行運算得到一個根hash的算法。

而可以想象,對參與算法的任何一個交易做小小的改動,都會導致得到的merkle root不一樣,所以區塊裡面只需要保存merkle root就可以了。這就算密碼學的力量。

區塊鏈適合什麼不適合什麼?

區塊鏈數據的特徵主要有兩點:1.公開透明,任何節點對數據有完全的權利去查看;2.難以偽造或篡改。因此,區塊鏈非常適合兩類場景:1.證據;2.監督。如果區塊鏈上的信息得到法律認可,那麼但凡拿出區塊鏈上的證據,侵權方將百口莫辯。而試想,如果將稅收完全遷移到區塊鏈,每個公民的每一筆稅收,最後都用到哪裡,一清二楚,這可能是令某些人害怕的點。

但區塊鏈有兩大缺點:1.要挖礦,還有分叉風險,也就是說一個數據放到區塊鏈上,要等很久才能成為不可篡改的可信數據。2.分區塊,數據被割裂存放,這給查詢帶來巨大的麻煩,非常影響效率。所以,區塊鏈不適合那種即時性要求高的場景,無論是信息交換的即時性(例如聊天)還是查詢的即時性(如搜索引擎)。

區塊鏈不是萬能的,某些服務明明中心化模式效率更高,成本更低,卻偏要為了風口搞區塊鏈化,那隻能看韭菜長沒長齊。還有一點令人擔心的是,由於區塊鏈上信息的公開透明,而且不可刪除,是否會對個人隱私造成極大的損害,試想一下,當年給冠希哥修電腦的小哥通過區塊鏈網絡炫耀自己發現的照片……那對當事人的傷害……連人死了都不會消散……

區塊鏈應用

隨著風口的來臨,區塊鏈應用此起彼伏。但目前比較成熟的,無非三種模式:1.比特幣;2.以太坊智能合約;3.比特股。其他的,不多說,讀者自己看著辦。

一個區塊鏈應用,它的架構是怎樣的呢?在區塊鏈本身之上,還需要有哪些其他的技術來支撐呢?

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

區塊鏈應用體系架構圖(邵奇峰等《區塊鏈技術:架構及進展》)

區塊鏈應用,如比特幣、以太坊,與區塊鏈本身有比較大的耦合度,也就是說區塊鏈作為數據庫無法較為獨立的成為應用中的一個模塊,和我們現在流行的B/S架構稍有不同,區塊鏈應用中會把區塊鏈拆解之後,於應用其他層進行融合,最終實現應用的整體功能。

我們以比特幣為例來講一個區塊鏈應用,比單純一個區塊鏈本身多了哪些部分。比特幣是一個基於區塊鏈的賬單系統,它除了區塊鏈,還要包含:1.交易模型;2.身份認證體系(類似PKI);3.智能合約。

交易模型

交易模型就是區塊體內保存的交易記錄。之所以比特幣裡面的每一筆錢的來龍去脈都一清二楚,就是依賴於交易模型。我們現實中銀行裡面的一個賬號,只會告訴你一個賬號現在有多少錢,曾經花了多少錢,收入多少錢,還欠多少錢。但是不會告訴你“某一筆你花掉的錢,來自你某一筆收入”。但比特幣裡面必須告訴你這樣的邏輯,一條交易包含“輸入”和“輸出”兩個部分,比如你要轉10BTC,那麼你的賬號必須有一個或多個“輸入”加起來總和等於或超過10BTC,而輸出就是指你要把這10BTC轉給誰。但是有一種情況,當所有“輸入”加起來為10.5BTC時怎麼辦,就像你有100塊毛爺爺,去買70塊的東西一樣,需要“找零”。所以“輸出”有的時候會有一個是轉給自己的,就是“找零”。

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

比特幣交易輸入與輸出示意圖

而實際上,輸出在另外一個交易中,又是這個新交易的輸入。

在區塊體裡面,這些交易記錄,以及它們的輸入輸出都被如實記錄。除此之外,還要進行merkle計算,將merkle root存到區塊頭中。

身份認證體系

既然是交易,那麼必然涉及到交易雙方的身份。比特幣交易的兩端是兩個賬號,至於到底是誰它不管,但它通過加密算法,保證這一筆交易是哪一個賬號發起的,發起交易的人要對交易信息進行簽名。

你可能聽過非對稱加密、公鑰和私鑰。比特幣賬號最關鍵的就是這個私鑰,一旦私鑰丟失,你就無法證明自己是這個賬號的主人,也就無法從賬號中進行轉賬要做的簽名動作,你就不能再花這個賬號裡面的幣,也就丟失了幣。

那麼簽名是怎樣的一個過程?怎麼證明這個交易是我發出的?怎麼證明這錢是轉給我的?

密鑰、地址與錢包

密鑰 通常指的是保護比特幣資產的對應於所有權用戶的私鑰,個別時候也會模糊的統稱私鑰和公鑰為密鑰,這裡我們以狹義的私鑰解釋為準。

地址 比特幣的收款地址,大部分情況下是指對公鑰的封裝(個別時候除了公鑰還有腳本)。

錢包 一種比特幣客戶端軟件,是私鑰的容器,通常通過有序文件或者簡單的數據庫實現。比特幣錢包包含私鑰和公鑰數據,儘管公鑰數據理論是是不需要存儲的。

一般來說,用戶的公鑰和比特幣地址可以劃等號,但實際上不是。比特幣地址是一串比公鑰短很多的字符串,主要是為了方便輸入。而公鑰則用於各種非對稱加密。

區塊鏈不談技術的都是韭菜——區塊鏈技術組成及架構

比特幣公鑰到比特幣地址

公鑰和地址都是公開在比特幣網絡中的,只有私鑰是用戶自己保存,不能給任何人。當一個交易發起時,交易發起方用“自己的私鑰”和“接收方公鑰”對交易進行簽名,那麼網絡中的其他人就可以用發起人的公鑰去驗證這個交易是不是他發起的,對於接收方而言,要提供自己的私鑰進行解密運算,來證明這個交易確實是發送給自己的。而比特幣客戶端(錢包)就是幹這個加密解密和簽名的事。

智能合約

比特幣本身已經有智能合約的雛形,只是它所採用的編程語言腳本能力比較弱,能實現的合約邏輯不復雜。以太坊則是在這個基礎上擴展鏈智能合約部分,使智能合約的編程能力大大增強。

在上文提到的輸入和輸出,輸出其實就被作為另外一個新交易的輸入。比特幣的輸出不單單是告訴系統要轉給哪個地址多少錢,輸出實際上是一段比特幣腳本。這段腳本也經過複雜的非對稱加密,要運行這段,想要得到一個輸出裡面的錢,把這筆錢作為自己交易的輸入,必須用自己的私鑰先解密腳本,然後運行腳本,腳本運行完,這筆錢就可以作為自己交易的輸入了。結合前面的知識,只有擁有對應的私鑰才能解密,所以,只有輸出記錄對應的比特幣地址對應的那個用戶才能解密腳本,得到這些錢。

在這個過程裡面,“腳本”是一個關鍵,除了上面這種最簡單的轉賬邏輯,還可以通過一些條件判斷來實現稍微複雜一些的編程,比如只有當滿足某些條件的時候,解密後的腳本才能運行。於是,基於這種設計,比特幣的腳本系統可以用來實現多重簽名、保證合同等功能,也就是智能合約的雛形。

結語

對於區塊鏈的研究,我也是剛剛開始,必定有不少地方沒有理解透,有些地方也有誤解。但對於想要了解這個領域的朋友,希望你們先了解區塊鏈背後的技術原理(不必對技術細節掌握透徹),讀一些比較成熟的可信的材料(我一不小心發現前人已經在《計算機學報》上發表類似綜述的文章了,讀者可以閱讀《區塊鏈技術:架構及進展》),而不是道聽途說就信以為真。一旦你掌握了這些技術原理,就會發現,其實它的限制挺多,有美好的地方,也有沒必要的地方,那些莫名奇妙的項目就坑不到你了。

原文載於我的博客:http://www.tangshuang.net/4133.html 如果後期又發現一些錯誤,會在我的博客去更新,所以請關注我的博客。

相關文章

JS超級對象Objext:響應式、版本控制、數據鎖

HelloType:JS運行時數據類型檢查工具

WebRTC點對點通訊架構設計

angular髒檢查原理及偽代碼實現