智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

稀土君發表於2018-09-29

編者按:本文系 Qtum 的 鍾文斌講師,在由掘金技術社群主辦,以太坊社群基金會、以太坊愛好者與 ConsenSys 協辦的 《開發者的以太坊入門指南 | Jeth 第三期 - 上海場》 活動上的分享整理。Jeth 是圍繞以太坊技術開發主題的系列線下活動。每期 Jeth 會邀請以太坊開發領域的優秀技術團隊和工程師線上下分享技術乾貨。旨在為開發者提供線下技術交流互動機會,幫助開發者成長。

歡迎新增稀土君微信:xitujun,回覆“以太坊”進群和講師交流。

本場分享視訊回放連結(B 站)

分享整理傳送門

1小時搞明白以太坊 DAPP 開發 - 熊麗兵 | Jeth 第三期

講師介紹

鍾文斌,本科畢業於上海交通大學,中國科學院碩士,現任 Qtum 量子鏈中國首席開發工程師,主要負責 Qtum Core 和 Qtum x86 虛擬機器等開發,對區塊鏈基本原理有較為深入理解。在加入 Qtum 之前就職於 SYNOPSYS 任高階研發工程師,有超過四年的大型軟體開發經驗。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
大家好。我是鍾文斌,來自 Qtum。為什麼我能來講以太坊智慧合約開發?因為 Qtum 本身是支援以太坊這套虛擬機器的,相當於相容吧,所以我們也算是有一些瞭解。

今天我會講以下幾個話題。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

首先,為什麼我們要智慧合約?智慧合約到底長什麼樣?最後我們說以太坊智慧合約全棧走一回。DApp 作為一個 APP,在使用者點選那個按鍵之後,它到底發生了什麼?我們今天都會涉及到。

為什麼要智慧合約

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

智慧合約大家應該知道,不論是比特幣以太坊還是很多現在的需要挖礦的鏈,他們都在進行挖礦這麼一個行為。那挖礦是什麼?我今天就不做深入解釋了,但是至少大家知道挖礦是非常浪費資源的。

那這麼浪費資源到底是為了什麼呢?

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

為什麼我們好好的跑在伺服器上的 app,需要變成 DApp?它其實是一個社會科技。整個社會之所以存在,是因為人與人之間要協作。在不存在協作的情況下,可能是我自己做一個獨立開發者,可以做任何事情。當我需要跟我的朋友或者合作伙伴去合作的時候,我就需要互相信任。這些信任是需要成本的,合作的範圍越大信任的成本就越高。比如說我和我的親朋好友合作,那基本上我是非常信任他的。再往大說,我們要在整個社群合作,比如說整個掘金社群要一起做一件事情,我們可能就需要更大的信任。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這個信任最重要的一點在哪裡?就是不要侵犯別人的利益,並且保障自己的利益。熙熙攘攘皆為利益往來,所以沒有利益的合作,就不大需要信任,但是最需要信任的地方是哪裡?往往就是有利益的地方,有錢的地方。所以無論是社群城市國家,甚至全球都需要這麼一種協作。要實現協作就會有成本。

區塊鏈能做什麼?降低互相傷害的風險,那友誼的小船就不會翻,所以說它就是使能夠使人們能夠達成信任,也就是說能夠在利益上達成一致,大家可以不用擔心別人騙我的錢。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我剛才說,這是一個Social Technology,就是說之前我們所有人都在基於信任做事情,但實際上信任的門檻是非常高的。剛剛大家都已經互相認識了,但是我想問一下你信任對方嗎?這是非常難的。但是你信任你的父母嗎?你應該是信任你父母的,這是在長時間的積累下,才有這樣一種信任。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

所以信任是很難建立的。人們想到法律,用法律來保障人之間的信任,但這遠遠不夠。還有就是我們一開始是親友的一些人情,到後面變成市場。我們一開始的協作可能是我們兩個人,最後演變成更多的人蔘與,就需要更健全的法律。或許我們可以用智慧合約來實現這一切。

這個是之前經合組織釋出的,一些國家的政府開銷佔整個 GDP 的比重。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我們可以看到這36% 到58% 不等,這是個非常高的一個比例。這些比例在做什麼?就是使大家能夠協作。也就是說讓大家能夠信任政府,或者信任這些組織,能夠做一些事情。這就是信任的成本。所以智慧合約就是,我們用程式用程式碼來代替我們人工實現這些信任,讓智慧合約作為一個信任和協作的工具

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

以上就是簡單地介紹了一下智慧合約做什麼,為什麼我們需要去挖礦?它其實就是說能夠讓人建立起信任。

智慧合約具體是什麼

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

它說是一種合約,實際上就是一段程式。大家應該知道 AWS LAMBDA。一般我們去開發一個業務邏輯,在開發業務邏輯的同時,我們還需要去維護後臺的一些伺服器,去維持這個業務邏輯。AWS LAMBDA 可以實現這麼一個功能,你只需要關注你的業務邏輯,然後你把業務邏輯放到 AWS LAMBDA 這個平臺上,之後,使用者只要呼叫這個業務邏輯,他就可以用了。你不用去管這個伺服器在哪執行或怎樣,最後就是使用者用了多少計算能力,他就付多少費。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

類似就是這麼一個架構。這個其實跟區塊鏈的理念有那麼一點像。區塊鏈或者說以太坊,也是這樣的一個平臺。你只需要關心你智慧合約寫了什麼,但最後它跑在區塊鏈上,你不需要去關心,但每個使用者需要為呼叫這個智慧合約付費。

舉例一:計數器

這就是一個智慧合約,是一個計數器,大家應該都能看懂。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

第一行,是 Solidity 的版本號。Solidity是現在智慧合約最主流的一個程式語言。這合約的名字叫 simple counter,就是一個簡單的計數器。它很簡單,裡面有個 counter,有個 function,就是對這個 counter 進行一個加加的操作,好像跟普通的 JS 的程式沒什麼太大區別。 但實際上智慧合約和它有很大的區別。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

它在操作的這個 counter,實際上是在操作一個資料庫。就是說如果是一個類的一個例項,一般是放在記憶體裡面,記憶體清掉之後,這個 counter 的所有資料都不存在。實際上在這個合約上面,這個 count 是記錄在資料庫裡面的,所以你每進行一次加加,實際上是進行了一次讀寫,對資料庫進行了一次讀寫。它和普通的 JS 稍微有點不一樣。

舉例二:功德香火鏈

我們再看一個更好的例子。這個例子是我個人非常喜歡的。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這個叫做功德香火鏈。這個的需求其實很簡單,就是說你捐贈香火,我們在區塊鏈上給你計一次功德,給你念一句阿彌陀佛。大家感受一下這佛光。

其實這個例子我們簡化一下,它有三個需求。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

首先我們要初始化,設定這個鏈上有一個管理員,比如說方丈,方丈管錢。每個人都應該能夠捐贈功德。所以每個人都要能夠捐贈,並且這部分錢只有方丈可以動,不是每個人都可以取出來的。所以說如果你在剛才說的 AWS LAMBDA 上面去做這樣一個東西,是沒有人會信任你的。你可以隨意改這裡面的資料,你也不知道我有沒有記你的功德,這錢用在哪你也不清楚。但是智慧合約它最厲害的地方就是說它跟錢相關,並且能夠讓別人相信這個錢沒有被亂用,這是怎麼做到的呢?待會我們講全棧的時候會解釋,但現在我們先來看看這個合約。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這個合約通過剛才需求分析,其實就這麼十幾行。我們稍微把它分解來講一講。首先第一個需求,我們要設定管理員。 這個就是相當於合約的初始化的一個函式。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這邊有兩個比較關鍵的地方,一個就是 msg.sender,相當於當前呼叫那個合約的使用者。你在區塊鏈上放一個合約,每個人都可以建造一個這樣的鏈,所以你怎麼知道這個鏈是不是某個大師釋出的呢?那這個大師要公佈一下這個他所建立這個合約的地址。每個人都可以建立一個不同地址的合約,但是隻有這個大師,他公佈的才是大家想要捐贈功德的地方。所以這個 msg.sender 就是當前合約建立者的地址。我們把建立這個合約的這個人設為 owner,就是管理員。

第二個需求就是每個人都必須能夠捐贈。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

有幾個比較關鍵地方,這邊有個屬性叫 payable,就是說這個合約是可以往裡面打錢的。 我剛才說過智慧合約最厲害的地方就是它可以管錢,所以你可以通過設定 payable 的屬性,往這個 function 裡面打以太坊。這個 msg.sender 就跟剛才不一樣了,他當然還是呼叫合約的這個人,但現在是呼叫合約的人就變成了捐贈者,他往裡面捐錢,然後他會做一個 assert,說你捐贈的金額必須大於0.001以太,不然就不夠香火錢。你敬贈完之後,如果滿足條件,那我就給你念一下阿彌陀佛,然後給你記錄一條日誌,大家都可以在鏈上看到你捐了錢,你被唸了一句阿彌陀佛。

最後一個需求是說只有方丈可以取錢。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這邊有一個 require,當前呼叫 withdraw 這個 function 的人必須是管理員。我們一開始建立合約的時候就建立了管理員,就是這個方丈。一旦認證通過,方丈就可以取這麼多的錢到某個賬戶。這邊還可以再插入一個日誌,比如說去翻新佛像,類似這樣的事情。這就是一個非常簡單的智慧合約的例子,它與普通的 APP 不同之處就在於它所有東西都記錄在區塊鏈上,它是公開透明的,大家可以驗證這個合約確實存在。而且你可以看到往裡面打的每一筆錢,任何人都沒有辦法修改,包括這個 owner,他只能提款,他也不能修改裡面發生的所有轉賬的行為。

EVM 平臺的特性

我們還回到這個智慧合約這個東西。我們剛才講到都是跑在以太坊上的智慧合約,以太坊的虛擬機器就是智慧合約的執行環境,叫 EVM,Ethereum Virtual Machine。它有一些什麼特性呢?

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

一是呼叫合約由使用者承擔計算費用。 無論是方丈創造那個合約,還是你去捐贈,還是方丈去取錢,它都需要一個叫做 gas 的手續費,這個手續費都是呼叫合約的人去付。

二就是使用者能夠完全掌握這個許可權。 你的捐贈行為和方丈的提現行為,都由他們自己控制,通過什麼控制?通過客戶端的一個簽名,你掌握了私鑰,你就可以對它進行簽名,簽名之後服務端去驗證,通過之後再在整個區塊鏈網路上去廣播,再去驗證。所以說每個人它自己控制了自己所有的許可權,不存在說像AWS lambda 一樣,你掙的錢就相當於給了這個平臺。但是這個是放在一個合約裡面,大家都能看到的,都能驗證的一個環境裡面。

另外一點就是效能低下。 以太坊網路其實全球有將近2萬個節點,那比特幣網路可能有將近1萬多個全節點。一個2萬多臺機器的網路,可能計算功能應該是特別強大的,但實際上並不是。它的效能取決於網路上效能最差的那臺計算機,為什麼?因為每個節點都要重複計算。你對一個合約的呼叫,每個節點都需要計算一遍,每個節點都相當於儲存了一份完全的拷貝,它需要去達成全網的一個共識。這就是為什麼我能夠信任這個網路,因為即使少數的人在作弊,我們大多數人都還在驗證大多數人所承認的事實。所以我們可以相信比特幣或者以太坊這個網路。但是這它的效能其實是很低下的,因為每個節點在做的事情其實是一模一樣。

去中心化平臺的缺點

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

,剛才已經介紹過。

,每個呼叫合約的行為,你都需要付 gas。

,就是它效能也很差。

我們訪問一個網頁,相當於發出一個網路請求,伺服器就把所有資訊發給我們,這個請求非常簡單,這個整個互動的過程非常簡單,生命週期非常短。但是在以太坊上在比特幣上所有的互動都是通過 transaction,交易來完成的。整個交易生命週期非常複雜,還需要經過所有節點的全網驗證,而且中間會出現很多各種各樣的錯誤。而且它也沒有這種網路請求,也沒有可靠的隨機源。

最令人髮指的一點就是合約一旦部署了是沒法更新的。你可以刪除某個合約,但是你不能更新。一旦出了 bug,問題會非常嚴重。普通的軟體出了 bug,可能就是一個運營事故。但是以太坊的 bug 出現過幾次,都是動輒幾千萬美金。比如說 Parity 那個事件,它裡面的一些合約被刪掉,那個錢雖然理論上說沒有丟,但是它所在的某個地址上,所有人都沒有辦法再把這錢取出來,1.5 億美金就被凍結了。所以說智慧合約上的一個小小的瑕疵,都可以造成非常大的金融損失。但這也是它的魅力所在,它能夠管錢,它跟錢相關。人之間的共識信任很多是建立在這種利益之上。

去中心化意義何在

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

按照套路,我現在就要講它意義何在了,實際上我也還沒想清楚。所以說這是丟擲來一個開放性的問題。

我剛才已經介紹了去中心化平臺大概是什麼樣子,它的特點是什麼,但它的意義何在呢?我不想去評論一些什麼,因為整個行業都還在思考。去年的我如果在這個時間點說,我會說它可能會要改變世界,但是今年一年的事情發生下來,去中心化應用這條路,到底最後能不能走通,我個人目前保持觀望態度。所以課程我們還繼續講,但是意義何在,希望大家聽完之後自己去思考。我們這個世界到底到底需不需要所有東西都是去中心化? 我認為肯定不是,我認為可能是一箇中間狀態,但去中心化一定有它的意義所在,至少我們現在擁有比特幣可以不需要一箇中心化的機構實現一個全球的那麼一個價值流轉。至少我們有以太坊,它使我們能夠在大家互相不認識的情況下,進行 ICO,進行融資,這是一個非常偉大的創舉。

DAPP 全棧走一回

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我們剛才說到了智慧合約,舉了兩個例子,那如果它變成一個應用,它最後在鏈上到底發生了什麼呢?我們再舉一個例子。

舉例三:簡單儲存合約

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

這個是一個非常簡單的智慧合約,就是一個簡單的 set 跟 get ,一個簡單的儲存,並且獲得值的這麼一個應用。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

一個應用,它本身可能從前端到後端有這麼一些東西,所以我待會也會從前端到它怎麼進行一個 RPC 呼叫,怎麼樣進行 ABI 的編碼,合約怎麼樣執行。然後在 EVM 上是變成怎麼樣執行的,最後是怎麼樣放到那個資料庫裡面。所以這一點從這個一路我都會講下來。

前端:WEB 2.0 VS WEB 3.0

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我們先來看看,這是 Howard 同學寫的,關於web 2.0 和 web 3.0。

Web 2.0就是現在大家所熟知 Web 的整個框架。那類比於 DApp 的話,我們暫時把它稱為 Web 3.0。

前端 Web 裡面可能是 HTML 服務,那在 DApp 開發裡面,我們可能就是一個 DApp 或者 Web 3.0,其實沒有太大區別。

那剛才說了 Web 2.0 可能是網路請求,但在 Web 3.0 裡面所有東西都是通過合約,通過 transaction 交易去觸發的。

Web 2.0 裡面資料的組織方式可能是 JSON,在以太坊上可能是 ABI 編碼

伺服器端我們可以通過這些請求,我們可以進行一些操作,或者實現一些業務邏輯,那在所謂的 Web 3.0 裡面,它其實就是通過智慧合約來處理這些業務邏輯。

在 Web 2.0 裡面我們可能會有作業系統,Web 3.0 都是以太坊虛擬機器。實際上它是把虛擬機器跟作業系統做了一個混合,區分的不是非常的明確,既有虛擬機器要做的一些事情,也有作業系統層面的一些事情。

那在 Web 2.0 裡面,我們可能有資料庫,在 DApp 開發裡面也有資料庫,是通過 Merkle Tree 的方式去組織起來的。實際上在以太坊裡面合約儲存並不是 Merkle Tree,是 MPT,Merkle Patricia Tree。我們可以把它簡化成 Merkle Tree,其實指導思想是一樣的。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

所以前端其實要做的事情很簡單,就是展示鏈上資料,或者是 DApp 的一個入口。

我們在本地需要做的事情就是簽名,所有東西都是一筆交易,你可以在這一筆交易裡面傳送以太坊,也可以在這筆交易裡面去呼叫合約。

我們平時可能接觸到跟區塊鏈比較相關的一些應用,那大概分為這兩類。就是像 coinbase,binance 那些交易所。這個平臺實際上並不是一個 DApp,雖然它跟區塊鏈相關,處理區塊鏈的一些交易,但實際上它是一個完全中心化的平臺,所有的資料都在他的伺服器上面,所有的請求,甚至你的幣都是打給他們平臺。

另外就是 myetherwallet,imtoken 這種手機端的或者網頁端的錢包軟體,每個使用者自己能夠完全掌握私鑰,不用把錢把以太坊比特幣打給任何一箇中心機構,使用者完全掌握這筆錢的動向,所以它更像一個去中心化的應用。

前端例子:REMIX IDE

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
我們看看這個前端的例子,剛才那個合約大家還記得嗎?一個set 一個 get。這個REMIX IDE 上面有一個叫 simple contract 的合約。這合約有兩個 function,一個叫get,一個叫set。我們現在 set 一個666,然後你按下這個按鍵之後發生了什麼呢?

用 RPC 遞交事務

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
它會生成一筆以太坊的交易。比較關鍵有兩個資料,一個是 from,說從哪個地址呼叫,一個是 data ,你呼叫的這個合約裡面包含了哪些資料。你按完這個按鍵之後,你會發現你在以太坊上進行了這麼一筆交易。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
這個交易 function 是 set,它 set 了一個16進位制的值,就是666。這個就是以太坊上一個交易。

用 ABI 編碼傳遞資料

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我們來看一下它傳遞的引數,我們剛才看到一大串那個data,它是什麼呢?這個 data 的前四個位元組,實際上就是選擇呼叫哪一個 function。這四個位元組是怎麼來的?

對 set 這個函式的原型做一個 SHA 的操作,它會變成很長的一串雜湊。我們取前面四個位元組作為這個函式的標識。所以你看到 data 的前四個位元組就能確定,我現在呼叫的是這個 set 函式。後面的這個資料就是我們要傳入的引數,就是666。具體到以太坊的虛擬機器怎麼處理這麼一段東西呢?

EVM 位元組碼

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
它可以變成這樣一個位元組碼。最關鍵的一點是最後它會進行一個 sstore 的操作,它會在某個資料庫裡面把這東西寫進去。我們把它變成比較好理解一點的虛擬碼的話就大概這樣。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
它其實進行了三個東西,頭四個位元組,我可以確定我是要跳到哪一個函式,並且這個函式傳入的引數是第四個位元組後的那32個位元組,它每個引數的長度都是固定的32位元組。在666讀出來之後,這個 set 函式進行的操作就是往一個記憶體裡面寫這個值。

資料儲存

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

那寫在哪裡?它實際上是寫在一個資料庫裡面。但是這個資料庫會通過 Merkle Tree 的資料結構,反映到區塊上面。Merkle Tree 是個二叉樹,它所有的節點的值都是下面兩個子節點的雜湊。所以一旦發生某一個值的改變,整個樹相關路徑上的雜湊都會發生改變,最後的根也會發生改變。這整個樹的根的雜湊相當於所有這些資料的簽名,或者標識。一旦某個資料發生了任何改變,整個 root 雜湊也會發生改變。剛才我們把 666 這個資料寫到一個地方,然後這個整個雜湊就發生改變,我們重新計算出一個根雜湊的值。這個值就放在區塊鏈上。區塊鏈它每個區塊除了包含所有的交易之外,最重要的一塊,它有一個區塊頭。這個區塊頭有幾個結構,一個是它包含上一個區塊的一個雜湊值。以此類推,我這個雜湊值標識了前面所有的區塊所有的交易。如果別人想騙我,說他改變了前面的某一筆交易,那我這個雜湊的驗證就不會通過,它會被整個區塊鏈網路認出來,說這個是篡改的。我們之所以說區塊鏈是不可篡改的,就是因為有這樣一個結構。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期
那另外一個東西就是我們剛才說到 Merkle Tree 的根。Merkle Tree 的根就是所有交易的雜湊值的一個標識,一旦這些標識被確認之後,這個根也就唯一確定了。然後這邊有個 nounce,就是我們所謂的挖礦的關鍵。所謂的挖礦,其實是在計算符合某一個難度要求的雜湊值。為什麼比特幣要去挖礦,首先比特幣想實現一個去中心化的網路。在中心化的網路裡面,我需要服從一箇中心化組織。但是在去中心化的網路裡面那我聽誰的?我產生一個一個新的區塊,我應該服從誰挖出來的那個區塊呢?那就讓大家一起算一個值,這個值是一個雜湊值,它沒有任何取巧的辦法,只能通過增加算力來解決這個問題。把前一個區塊的雜湊加上這個 Merkle Tree 的這個根,再加上區塊頭的一些資訊,這個 nounce 是唯一可以改變的變數,你通過改變 nounce 從 0 到 一個非常非常大的值,你可以一直在算某個雜湊。一旦這個雜湊符合某一個難度要求,比如說前面 10 位為零或者 11 位為零,它就相當於滿足了全網共識的難度要求。在這個難度要求下,你產生的這個區塊就是合法的,你就可以向全網廣播。一旦你是全網第一個算出這個雜湊值的人,你就成為最新的這個區塊生產者,可以獲得比特幣或者以太坊的獎勵,也就是說你挖到礦了。比特幣或者以太坊,可以通過這樣的方式實現比較分散的分發(假設礦池不存在)。還有就是可以保證隨機性。在一個去中心化的、大家誰都不信誰在網路裡面,如果某一個人固定去產生區塊,他很快就會被攻擊比如 DDoS 之類。他一旦不能產生新的區塊,整個網路就會癱瘓。通過這個方式可以非常隨機的讓所有人都有機會生產下一個區塊,攻擊者完全無法預測下一個產生區塊的是誰,那他就無法去攻破這個網路。 所以說我認為有兩點,一就是幣的分發,二就是保證隨機性。 我們剛才說到資料庫,儲存這個資料的 transaction,最後反映到這個 Merkle Tree 上,最終通過一個雜湊的方式存在鏈上。隨著這個鏈越來越長,相當於每個區塊都有前面所有鏈條的證明,它就變成了全網共識,沒有人能夠改變,也沒有人能夠去偽造。 這就是為什麼我們剛才 set 了一個666,它不會存在某一臺伺服器上,或者是幾臺伺服器上,或者某個人能夠去更改這個666。因為全球一萬多個以太坊的節點都在他們本地的資料庫上記錄了,我這個合約裡面這個值就是六六。即使你某幾個人想去改他,也不可以打破這個共識。包括剛才那個捐贈功德香火鏈也一樣,所有人都知道了,你這位仁兄是念了五句阿彌陀佛的,這個方丈是取了這筆錢來幹嘛的。他不會由於任何個人或者少數人的作弊發生任何的改變。

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

剛才這個過程就是我們從前端到ip到最後的儲存,看了一遍,以太坊上智慧合約是怎麼樣去執行的,它最後到底產生了一個怎樣的效果。

新一代智慧合約平臺

智慧合約全棧介紹 - 鍾文斌 | Jeth 第三期

我們剛才講到都是圍繞以太坊,但是不得不說以太坊的虛擬機器並不是一個特別好的一個虛擬機器,當然它是為了智慧合約專門設計的一個未來安全性實驗的一個虛擬機器。目前以太坊虛擬機器還有以下缺點:

  • 只能用 Soidity 語言程式設計
  • 沒有標準庫
  • 合約之間的互相呼叫關係無法預先確定,無法並行執行一些合約
  • REMIX IDE 編譯器過於古老
  • 虛擬機器與作業系統不分層
  • 智慧合約無法更新

業界有很多人在做新的虛擬機器,比如說比較火的 WebAssembly、EOS 他們都在做。可以支援 JS 網路程式設計。然後比如說 RChain 這個專案,他自己搞了一個 Rholang 就是新的程式語言。 我們 Qtum 也在做新的虛擬機器,是一個 x86 虛擬機器。相信大家應該都聽過 x86 指令集。基本上我們現在所有的裝置至少是非移動裝置,還是用英特爾的 CPU,他支援的就是這個指令集。大部分程式語言,大部分的工具都能夠被編譯成 x86 指令集的可執行目標檔案。也就是說如果我們在區塊鏈上支援了這個虛擬機器,那目前大部分的主流語言和主流的大家熟悉的工具,就可以直接被拿來使用來編寫這個智慧合約。所以說可能這個可以給大家帶來一些便利,我們也希望如此。

還有就是說,以太坊的虛擬機器跟作業系統層其實是混合在一起的,這在程式設計當中可能帶來了很多的困擾,所以說我們會把它進行一個分層的設計。另外整個智慧合約它是沒法更新的,但是在 Qtum 裡面我們可以做到這一點。就是我們有一個相當於分散式自治協議,那通過這個協議我們可以但比如說我們有一些標準庫。那整個業界,當然我這邊沒有列全,也各種各樣的專案都在做這個虛擬機器。但不可否認目前這個以太坊還是最流行或者是最成功的一套虛擬機器,也是最成功的一個智慧合約執行環境。

我今天分享就到這裡。這是我們GitHub地址:qtumproject,供大家參考。

相關文章