3月30日~3月31日,由CSDN、火星財經主辦,中關村區塊鏈產業聯盟、柏鏈道捷、區塊鏈大本營、TokenSky聯合主辦的區塊鏈技術及應用峯會(BTA)·中國,在北京喜來登長城飯店盛大舉行。

作爲時下最熱門的行業話題,區塊鏈以其顛覆性的技術理念,正在對各個行業施以影響,吸引了全球技術圈、投資者、創業者的關注。爲了深入理解區塊鏈及其背後的技術本質,本次大會邀請了80+區塊鏈技術領導人物、100+區塊鏈投資商業大咖,就區塊鏈的發展趨勢進行探討,讓人們有機會全面瞭解這一全新的生態。

作爲本屆大會的重要嘉賓之一,Achain技術合夥人李譜在下午的會議中分享了題爲《智能合約--構建未來信任的基石》的主題演講。

李譜,Achain技術合夥人,致力於區塊鏈底層研發及區塊鏈應用落地,區塊鏈領域開發專家,畢業於清華大學軟件學院。加入Achain前,曾擔任阿里巴巴資深工程師、傲遊瀏覽器、UC瀏覽器研發工程師,擁有多年互聯網開發經驗。

在演講中,他從技術角度非常乾貨的分享了智能合約的數據設計、存儲、生命週期、交易整個流程。 他認爲,智能合約總體設計原則最重要的四點是:

數據設計

區塊大小

產塊時間

處理時間

在區塊鏈現在面臨的一些列問題中,他提出技術是區塊鏈行業發展的直接推動力。而對於那些想入門又不敢入門的程序員,他認爲,區塊鏈解決的問題歸根到底它也是一個程序,沒有什麼太複雜的

以下爲李譜的演講實錄:

大家好,我是來自Achain的李譜。Achain上線以來,一直致力於幫助開發者發佈智能合約。迄今爲止,運行在Achain上的智能合約已經達到87個之多。其中,這87個合約中涉及到金融領域、遊戲領域等各行各業。Achain是建立在RDPOS共識機制的基礎之上,大約每隔十秒產生一個區塊。到目前爲止,Achain產生了210個區塊,七十萬筆交易,40%是合約調用。以上的數據我們可以看到,智能合約對於Achain來說是至關重要的,下面我就開始智能合約的介紹。

智能合約是區塊鏈底層技術中重要的一環

Achain分爲四層:

接口層,包括CMD、RPC和API

邏輯層,包括NET、wallet、GLUA虛擬機、本地腳本以及約

內存緩存

存儲層,包括物理DB

Achain最上面是接口層包括CMD、RPC和API,中間是邏輯層包括NET、wallet、GLUA虛擬機、本地腳本以及合約,構成Achain的業務體系。其中虛擬機、本地腳本以及合約這三個部分構成了Achain智能合約的體系。我們的虛擬機是基於LUA智能合約編寫的,在裏面進行一些改善來適用。下面是內存緩存和存儲層。如果Achain上運行的是智能合約,就會啓動GLUA虛擬機進行計算,計算完成之後,存儲到裏面。

智能合約總體設計原則最重要的四點

智能合約總體設計原則最重要的四點:

數據設計

區塊大小

產塊時間

處理時間

設計一個智能合約是典型的虛擬機的應用,這裏面要考慮的因素特別多,我在這裏摘取最重要的四點,數據設計、處理時間、區塊大小,以及產塊時間。

首先,看第一點數據設計,Achain能夠提供一整套完整數據的存儲和存取。

Achain能夠很方便的把數據從底層的數據庫中取出來,組成虛擬機需要的數據,然後傳給虛擬機,等到數據再傳回來的時候進行存儲。

第二點,需要考慮區塊的大小。

我們都知道區塊鏈是以區塊爲存儲的,而區塊大小是有一定上限的,這個大小是10兆。我們的數據不能過大,如果過大,所承擔的合約調用數據會非常少,這樣會直接影響到合約調用的性能。

第三點,產塊時間是指,區塊產生的時間。

對於我們來說,Achain產生一個區塊大約是十秒鐘。包含兩部分內容,第一部分是三秒,用於全網同步;最後七秒,是留給合約調用。

第四點,處理時間是指,Glua虛擬機執行合約的一個時間。

留給合約調用的時間只有7秒,這個時間並不多,所以我們的處理時間就必須得儘可能的少,因此只能在七秒中做盡可能多的事情。

這四個約束條件特別有意思,區塊大小和數據設計,講的是空間的問題;處理時間和產塊時間,講的是時間的問題。這兩個問題是魚和熊掌不能兼得,讓處理時間和數據設計儘可能達到一定平衡。數據設計其實是跟這四個裏面最重要的一點,因爲數據設計不合理,會直接影響你的儲備時間,影響合約調度的效率。

合約數據的存儲

數據設計整體的一個存儲方案,是鏈上協同鏈下,鏈上存儲動作,鏈下存儲狀態。鏈條上面有區塊,而區塊很小,需要同步,不能無限的存東西。我們把這個分到鏈下來,鏈下是一個資源相對來說還比較充足,因爲我們可以發動全網。這樣可以鏈下存儲動作,鏈下存儲狀態,鏈下把連上的動作翻譯成狀態存在鏈下。

在這個方案之下要面對一個最複雜的問題:容器類。容器類的特點是,能夠添加數據。但總有一天會添加得非常大,怎麼辦呢?我們通過引用after來存儲動作,實現增加條目、刪除條目、修改條目。怎麼理解?其實就是程序遇到before,把自己數據庫裏邊關鍵字的條目刪掉,再把after重新插一遍。有了這個增刪改,我們把複雜數據的存儲變成了一個動作,這個動作可以存在區塊上。

下面舉一個簡單的例子,這個例子中間是時間軸,在時間軸之上,表示的是鏈上,也就是區塊;時間軸之下表示的是鏈下,也就是本地存儲。然後上面我畫了四個區塊,這四個區塊分別代表四種不同的操作。

第一個區塊,這個告訴程序,我要添加一種東西,因爲before關鍵值裏面有刪掉,把after值加到裏邊,本地存儲是空的。

第二個區塊,表示沒有動作,沒有動作鏈下就維持這個狀態,'a':1、'b':1、'c':2,第二塊用數據,應該用前一個區塊生成的數據。

第三塊修改的是,before{'c':1} after{'c':2},這樣第三塊鏈下的狀態數據爲'a':1、'b':1、'c':2。

第四個區塊是一個刪除,刪除'a':1、'b':1,after是爲空,程序遇到這一塊怎麼辦,首先找到'a':1,把'a':1刪除,再找到'b':1,把'b':1刪除,再看after是空的,只是刪除掉這些。

這樣的兩級存儲,然後我們就把所需要的數據全部能夠表示在鏈上,用動作表示在鏈上,我們可以看一下鏈上存在數據量非常小,beforo、after非常小了,鏈下非常大,提供給虛擬機。這就是我們鏈上加鏈下結合的存儲。

給虛擬機提供數據,以及數據存儲的問題,這裏面還有一個調用虛擬機返回值的問題。在區塊鏈裏面這個問題變得很複雜,因爲在區塊鏈裏,調用者只是負責把這個交易創建了,其他不做任何事,對於RDPOS共識機制,只負責處理交易,而處理完之後,有的業務是需要有返回值的,返回值又不能夠直接返回,直接返回代價太大了。

我們應該採用一種什麼方式來解決這個問題呢?

我們採用把返回值也上鍊。在本地寫一些腳本,這些腳本接收鏈上的信息。當返回值上鍊,本地同步到這個區塊,解析以後發現有關係的返回值,調用本地的腳本,間接得到返回值,這就是PPT第三個描述的主動掃描得到合約的調用。

是怎麼實現的呢?

有兩方面:

在虛擬機層面,需要支持這種語法

鏈上需要開闢一片空間

通過這種機制解決了調用合約返回值的問題,從而解決了虛擬機一個存儲比較大的問題。

合約操作的設計原則

數據的正確性

我們要設計一整套完整的,進行操作,這個操作能讓數據正確的流轉,這個是基本的條件。

生命週期的完整性

因爲我們設計合約的初衷是讓合約有一套完整的流向,生命週期的完整性是我們比較注意的。

操作便利性

不應該設置太複雜。

合約的生命週期及特點

經過以上三點的設計原則,我們得到了如下合約的生命週期:

編譯合約

註冊合約

調用合約

升級合約

銷燬合約

編譯合約

編譯合約是本地操作,需要啓動虛擬機,編譯完了以後,就可以上鍊。

註冊合約

註冊合約的意義是把編譯的合約自解碼上鍊存儲,方便以後調用。

調用合約

註冊完的合約成爲一個臨時合約,成爲臨時合約可以被調用。調用合約,是最

常用的操作。

銷燬合約

銷燬合約的結果是鏈上看不見合約,不過這是邏輯層面。

升級合約

我們都知道區塊鏈是不可篡改的,對此,升級合約就比較重要了。對於臨時合約,可以被銷燬,也可以被升級。一旦被升級以後就常住鏈上,永遠不會被銷燬掉。這個升級合約也是鏈上操作啓動虛擬機制,是我們Achain合約對外的接口。

合約交易與普通交易的流程

合約的交易流程大體上分爲三個步驟:

第一個步驟,創建

創建其實是由全網任何節點來做。在本地創建一筆交易,包括創建交易、簽名交易、廣播交易,通過P2P的網絡進行廣播。

第二個步驟,產塊

產塊包括確認交易、組織數據、執行合約。

確認交易

確認交易其實確認兩方面,第一方面就是驗簽名,簽名是否合理?是不是真的?驗錢數,這是普通的交易。第二方面,如果底下交易是一個合約調用,就需要代理進行確認交易。

組織數據

我們要給虛擬機方便的提供數據,要通過鏈下,把狀態數據抽取出來,然後給虛擬機。

執行合約

在虛擬機中執行組織好的數據,執行合約。

第三個步驟,廣播

產塊時間到了,就要把所有交易打成一個數據結構,然後把代理的簽名信息打上去,進行廣播,最終到全網。創建者作爲一個普通節點或代理節點,廣播這樣的話就完成了普通交易的全流程。

尚需優化的內容

合約整體還不是特別完美,還有優化的空間:

存儲粒度細化

二級緩衝

經濟模型

第一點,存儲粒度還可以繼續細化

雖然說虛擬機支持比較複雜的一系列的數據結構,但是那種複雜的結構,單條操作概率大於所有操作,那我們就把全量數據給虛擬機。我們有一種辦法,能夠很方便的抽出單條數據給虛擬機。當虛擬機需要全量數據的時候,我們可以花費一些時間組織全量數據給它。

第二點,二級緩衝

二級緩衝其實是爲安全性考慮的。普通節點創建併發布整個流程,代理有很多事要做,所以我們需要做一個二級緩衝。任何一個節點在發送交易的時候,首先要去查一下代理是否有空閒?如果沒空閒,可以先把交易緩衝在本地。代理有空閒的時候,我們嘗試廣播出去。這樣做的本質其實就是,把全網節點緩衝的能力都利用起來。

第三點,經濟模型

現在的經濟模型看起來有點粗糙,經濟模型其實跟存儲有關係的。我們把存儲力度細化以後,存十條數據,其實跟存一條數據,所消耗的gas是不一樣的,經濟模型也是空白優化。

技術是區塊鏈行業發展的直接推動力

我還是想說一點題外話,經過這兩天的會議,大家應該都能感覺到,區塊鏈發展到現在還是處於很稚嫩狀態。它還有很多問題沒有解決掉,比如說存儲、性能。如果把這些問題解決掉的話,那麼區塊鏈才能夠真正的往前邁進一大步。而解決這些問題需要大量的基礎人員參與,我的觀點,技術是區塊鏈行業發展的直接推動力。

從現實的情況看,其實區塊鏈行業組建人員實在是太少,在太少人中間程序員又太少,這些問題都需要大量的程序員花大量的時間來研究。我最近也跟很多程序員聊過,我也是做程序員出身的,程序員對區塊鏈的一種看法認爲搞不定區塊鏈,學習曲線太陡峭了。而我想告訴想入門又不敢入門的程序員,區塊鏈解決的問題歸根到底它也是一個程序,沒有什麼太複雜的。

相關文章