閱讀1204 返回首頁    go 汽車大全


解密區塊鏈:從基礎概念到技術實現的進階攻略

本文根據DBAplus社群第81期線上分享整理而成

講師介紹  20161117103145208.jpg

邢有濤

菜根科技技術總監

 

  • 負責Docker、Microservices、Swagger、Ethereum和Decent相關開發;精通Linux係統、驅動、網絡協議和並行編程技術,專注研究C、NodeJS和Go語言。

  • 七年電信設備開發和三年互聯網開發經曆,南京郵電大學電子信息工程專業碩士。

 

大家好,近年來,“區塊鏈”技術迅速走紅,其去中心化、去信任的機製得到全球市場的認同, 並有望成為下一代“價值互聯網”的基礎協議。 因此,借這樣的機會,首先給大家介紹一下什麼是區塊鏈,然後分享當下很流行的以太坊,最後完成一個簡單的智能合約,幫助大家對區塊鏈技術有一些初步的了解。

 

本次分享將包括以下三部分:

  1. 區塊鏈入門

  2. 以太坊介紹

  3. 以太坊開發

    a. 構建測試網絡

    b. 編寫合約

 

 一、區塊鏈入門  

 

簡單來說,區塊鏈是比特幣的底層技術。談到區塊鏈,就不得不先說一下比特幣。對於“比特幣(Bitcoin)”這個詞,有三層含義。首先,比特幣特指一種加密數字貨幣,是最早也是目前規模最大的加密數字貨幣。 其次,比特幣協議可以被看成一種基於區塊鏈的“價值傳輸協議”,該協議可以用來描述數字資產是如何在區塊鏈上轉移的。最後,比特幣係統指底層的共有區塊鏈技術平台,包含去中心化的公開總帳、比特幣錢包等軟件和係統。

 

加密數字貨幣  

 

比特幣(Bitcoin)是一種全球通用的加密電子貨幣(Crypto-Currency),完全交由用戶們自治的交易工具。比特幣的概念由中本聰(Satoshi Nakamoto)在2008年11月發表的論文《Bitcoin:A Peer-to-Peer Electronic Cash System》中首次提出。與數字貨幣不同,比特幣完全是去中心化的,不依靠特定機構來發行,而是依據特定算法,通過大量的計算產生。比特幣係統使用整個P2P網絡中眾多節點構成的分布式數據庫對所有的事務進行確認並記錄,並使用密碼學的設計來確保貨幣流通各個環節安全性。

 

比特幣協議  

 

  1. 共用標準:包括散列算法(Hash)、Merkle樹結構、簽名方式、事務驗證、地址格式等。
    共用結構:包括消息、可變長整數、可變長字符串,網絡地址、清單向量(Inventory Vectors)、區塊頭格式等。

  2. 消息類型:包括 version、verack、addr、inv、getdata,getblocks,getheaders,tx,block,headers,getaddr,checkorder,submitorder,reply,ping,alert 這 16 個消息報文的具體定義。

  3. 事務腳本

 

比特幣係統  

 

  1. 用戶:用戶通過密鑰控製比特幣錢包。

  2. 事務:每一筆事務都會被廣播到整個比特幣網絡中,由礦工將其寫入新的區塊。

  3. 礦工:通過競爭計算生成在每個節點達成共識的區塊鏈。

  4. 區塊鏈:是一個分布式的公共權威賬簿,包含了比特幣網絡發生的所有的事務。

 

盡管比特幣P2P網絡中的各個節點相互對等,但是根據所提供的功能不同,各節點可能具有不同的分工。每個比特幣節點都是路由、區塊鏈數據庫、挖礦、錢包服務的功能集合。一個全節點(Full Node)包括錢包、完整區塊鏈、礦工、網絡路由節點四個功能。

 

現在我們重新回到區塊鏈的話題上來。

 

20161117103156850.jpg

什麼是區塊鏈?  

 

區塊鏈(Blockchain)是指通過去中心化和去信任的方式集體維護一個可靠數據庫的技術方案。該技術方案讓參與係統中的任意多個節點,把一段時間係統內全部事務通過密碼學算法計算並記錄到一個數據塊(block),生成該數據塊的hash用於鏈接下個數據塊,係統所有參與節點來共同檢驗記錄是否為真,並且每個區塊的內容都由後續子鏈上的區塊來保證其內容不可被篡改。 各個參與節點可以在新區塊產生確認及獎勵分配上達成共識,從而逐漸形成的一個龐大、去中心化的公開賬本。

 

鏈上的每個區塊都可以用來記錄貨幣、股權、債券、數字簽名、數字合約,或其它任何數字化內容。在全球網絡下,由無數獨立的計算機來維護、更新和核查,確保記賬結果的公平、公正和公開透明,而無需任何中心化機構的審核和維護。

 

20161117103209150.jpg

 

我們仍然以比特幣為例,說明區塊鏈形成過程

 

  1. 平均每10分鍾由“礦工”競爭而產生一個新的區塊,並把這段時間內的多筆事務記錄到這個新區塊中。單筆事務寫入比特幣區塊鏈至少需要10分鍾。

  2. 目前每個區塊大小限製為1MB,最多能記錄約4000筆的事務。比特幣區塊鏈最大寫入性能大約隻有7筆/秒。

  3. 為了防止該區塊因為子鏈太短而被其它節點拋棄,需要等待產生6個新的後續區塊,才能最終確認該事務已經被可靠地寫入區塊鏈中。確保可靠寫入需要約60分鍾。

  4. 每個參與節點都可以保存整個區塊鏈的副本。隻要有參與節點存在,區塊鏈數據就不會丟失。 
     

那麼,在這樣去信任的場景下,該由誰完成賬本的記錄(即新區塊的產生)。為了解決這個問題,必須建立一套共識機製,確保價值的唯一性和不可複製性。 目前常見的包括PoW(Proof of Work,工作量證明),PoS(Proof of Stake,權益證明),DPoS(Delegate Proof of Stake,股份授權證明機製)等。

 

PoW  

 

比特幣區塊鏈主要使用PoW來實現共識。通過使用單向函數挖掘,使得礦工在得到正確的計算結果前,必須經過公開算法的計算,而結果的驗證速度非常快。通過驗證這個結果,其他礦工就可以確認是執行了一定量的計算工作才得出的。

 

PoW的優點是:完全去中心化,節點自由進出。

 

PoS  

 

PoS權益證明,可以看作是PoW的一種升級共識機製,根據每個節點所占代幣的比例和時間等比例的降低挖礦難度,從而加快找隨機數的速度。當創造一個PoS區塊時,礦工需要創建一個幣權交易,事務會按設定的比例把一些幣發送給礦工。

 

PoS權益證明方式在一定程度上縮短達成共識的時間,但是仍然需要挖礦的過程才能達成共識。PoS幣的規則會造成富者愈富的問題。PoS幣的利息越高,那麼該幣將會產生的不公平性就會越高。

 

DPoS  

 

DPoS類似於董事會投票,它的原理是讓每一個持有比特股的人進行投票,由此產生101位代表可以將其理解為101個超級節點或者礦池,而超級節點彼此的權利是完全相等的。DPoS有點像是美國的議會製度,如果代表不能履行他們的職責(無法生成區塊),即被除名,網絡會選出新的超級節點來取代他們。

 

DPoS可以大幅縮小參與驗證和記賬節點的數量,可以達到秒級的共識驗證。

 

公有鏈、私有鏈、聯盟鏈  

 

中本聰巧妙地將以下幾個成熟的技術和理論組合的一起,並以此為基礎構建區塊鏈技術:

 

  1. 基於去中心化的分布式算法而建立起點對點對等(P2P)網絡。

  2. 基於非對稱加密算法。

  3. 基於分布式一致性算法,解決了分布式場景下的拜占庭將軍問題。

  4. 基於博弈論而精心設計的獎勵機製,實現了納什均衡,確保整個係統的安全和穩定運行。

 

如果同時具有上述四點要素,可以認為這是一種公共區塊鏈技術,簡稱公有鏈。如果隻具有前三點要素,將其稱為私有區塊鏈技術,簡稱私有鏈。而聯盟鏈則介於兩者之間,可視為聯盟成員內的一種私有鏈。這裏主要介紹公有鏈和私有鏈。

 

公有鏈是指全世界任何人都可讀取的、任何人都能發送事務且能獲得有效確認的、任何人都能參與共識過程的區塊鏈。共識過程決定哪個區塊可被添加到區塊鏈中和明確當前狀態。作為中心化或者準中心化信任的替代物,公有鏈的安全由加密數字經濟維護。加密數字經濟采取工作量證明機製或權益證明機製等方式,將經濟獎勵和加密數字驗證結合了起來,並遵循著一般原則:每個人從中可獲得的經濟獎勵,與對共識過程作出的貢獻成正比。這些區塊鏈通常被認為是完全去中心化的。

 

私有鏈是指其寫入權限僅在一個組織手裏的區塊鏈。讀取權限或者對外開放,或者被限製。相關的應用囊括數據庫管理、審計、甚至一個公司,盡管在有些情況下希望它能有公共的可審計性,但在很多的情形下,公共的可讀性並非是必須的。

 

私有鏈相比於公有鏈的優點:

 

  1. 事務的效率更高:比特幣區塊鏈目前每秒可完成7筆事務,而私有鏈目前最高可以到每秒10萬筆,並且還有提高的空間。顯然後者更適應現實世界金融事務的需求。

  2. 事務可以回滾:這點對於中心化機構也很重要,在某些情況下,某些事務會因為錯誤或法律的問題而被要求修改、撤銷。

  3. 事務費用更低:目前公有鏈的事務費用是每筆0.10美元,而且隨著時間流逝幣值趨於增長,導致事務費用也在增長。而私有鏈的事務費用將會降低一到兩個數量級。

  4. 仍然是基於分布式網絡,保留了分布式記賬係統的優點。

  5. 提供了更好的隱私保護:公有區塊鏈因為其透明共享總賬本的設計,本身不提供隱私保護功能。而私有鏈可以對讀取權限進行限製,從而提供更好的隱私保護。

  6. 驗證者是公開透明的,不存在一些礦工出於共謀原因而致的51%攻擊風險。

  7. 節點可以很好地連接:節點互相可以很好地連接,故障可以迅速通過人工幹預來修複,並允許使用共識算法減少區塊時間,從而更快完成事務。

 

私有鏈的缺點:

 

  1. 違背了區塊鏈去中心化的本質,重新引入了若幹“信任節點”;

  2. 其參與者需要經過審核和驗證,從而嚴格限製了其規模,其安全性容易受到威脅。因此,私有區塊鏈更適合為傳統機構所用。

 

公有鏈的優點:

 

  1. 保護用戶:免受開發者的影響——在公共區塊鏈中的用戶更多、更廣泛,程序開發者無權幹涉 
    用戶的使用方式。反過來說,區塊鏈可以保護使用這些程序的用戶。

  2. 網絡規模效應——公共區塊鏈是開放的,因此有可能被許多外界用戶使用和產生一定的網絡效應。而在公有鏈上運行的應用越多,節點越多,那麼該區塊鏈條也會越可信。 
     

因此使用公有鏈,還是私有鏈,完全根據需求而定。

 

區塊鏈的演進  

 

區塊鏈1.0:可編程的數字貨幣

 

比特幣的發明人Satoshi Nakamoto在其2008.11年發表的論文《BitCoin:A Peer-to-Peer Electronic Cash System》中指出:“區塊鏈是指通過去中心化和去信任的方式集體維護一個可靠數據庫的技術方案。”

 

區塊鏈 1.0 的主要應用領域為“加密數字貨幣”,包括貨幣的發行機製、分配機製、幣值調節機製等。

 

比特幣可視為區塊鏈的首個在金融支付領域中的應用。比特幣所產生和使用的區塊鏈,是最早也是目前應用最廣泛的公有區塊鏈。

 

區塊鏈2.0:可編程的智能合約

 

在2015年10月召開的“2015首屆全球區塊鏈峰會”上,以太坊的創始人Vitalik Buterin發表了題為《Visions, Part 1: The Value of Blockchain Technology》主題演講,並重新定義了區塊鏈:“一個區塊鏈就是一個任何人都可以上傳程序並使其自己執行的神奇電腦,每個程序的當前和所有過去狀態都是公共可見的,強大的密碼經濟學保證程序能夠按照該區塊鏈協議所定義的方式持續執行。”

 

區塊鏈成為一種“信任的機器”,通過自我限製和安全加密,確保機器能安全可信地自動執行預設的邏輯。

 

區塊鏈2.0的主要應用領域為智能合約。智能合約能夠令各方自動執行操作,結果由軟件驗證,而非人類扮演中介。

 

典型應用:

  1. 股權、債權合約

  2. 證券與金融合約

  3. 互助保險合約

  4. 權利登記、轉讓

  5. 博彩

  6. 防偽

  7. 物聯網
     

區塊鏈3.0:可編程的社會治理

 

區塊鏈3.0目前沒有嚴格的定義,總的來說有兩大類應用:

  1. 超越貨幣、經濟、市場的公正性應用。

  2. 超越貨幣、經濟、市場的效率和協作。

 

區塊鏈3.0的主要應用領域為社會治理:

  1. 公證、見證

  2. 司法仲裁

  3. 投票

  4. 健康管理

  5. 人工智能

  6. 去中心化自治組織

  7. 身份認證

 

 二、區塊鏈2.0:以太坊Ethereum  

 

20161117103224249.jpg

 

Ethereum以太坊是運行在區塊鏈技術上的開放平台,使開發人員能夠建立和發布下一代分布式應用DApp。

 

Ethereum可以用來編程、分散、擔保和交易任何事物:投票、域名、金融交易、眾籌、公司管理、合約、知識產權、硬件集成的智能資產。

 

區塊鏈2.0重要的是智能合約、智能資產,而智能合約領域最有影響力的開發平台就是以太坊。

 

應用場景實例  

 

自行車的所有者會將一個Slock(智能鎖)安裝到他們的自行車上,並且在以太坊區塊鏈上給自行車注冊一個智能合約(一段程序代碼)。接下來,任何人都可以向該智能合約發起一個發送一定數量數字貨幣的請求,合約在接到這個請求之後,會自動將這筆數字貨幣轉發給自行車的所有者,這樣發送者可以獲得2個小時的使用權。

 

基本概念  

 

  • 挖礦

 

挖礦這個詞源於對加密貨幣與黃金的類比。黃金或貴金屬很稀有,電子代幣也是,增加總量的唯一方法就是挖礦;同時,挖礦也是通過在區塊鏈中創建、驗證、發行和傳播區塊的方法來保護網絡的。

 

挖以太幣 = 保護網絡 = 驗證計算

 

以太坊,與所有的區塊鏈技術一樣,使用激勵驅動的安全模式。共識基於選擇具有最高總難度的區塊。礦工創建區塊,其他人檢測有效性。

 

  • 外部賬戶 vs 合約賬戶

 

  1. 外部賬戶(EOA)

  2. 存儲以太幣餘額

  3. 發送transaction(以太幣交易或觸發合約代碼)

  4. 私鑰控製

  5. 沒有代碼

 

  • 合約賬戶

 

  1. 存儲以太幣餘額

  2. 相關代碼

  3. 執行代碼(被其他合約的transaction或消息觸發)

  4. 執行任意複雜的操作;操作自己的永久存儲

 

以太坊區塊鏈上的所有行為都是由外部賬戶通過transaction觸發的。每當合約賬戶接收到transaction,就按照輸入參數的指示執行。合約代碼是由參與到網絡的每個節點上的以太坊虛擬機執行。

 

代碼執行的唯一語境是區塊鏈上區塊的位置和所有可見的數據。區塊鏈的區塊代表時間單位,區塊鏈本身是時間維度,代表在鏈上區塊製定的離散時間點上狀態的整個曆史。

 

所有以太幣餘額和價值都以wei為單位:1 ether = 1e18 wei

 

  • 事務(transaction

 

transaction在以太坊裏指被簽名的數據包,數據包存儲著從外部賬戶發送到區塊鏈上另一賬戶的消息。

 

transaction包括:

 

  1. 消息接收人

  2. 簽名:用於確認發送方身份和發送消息的意圖

  3. VALUE:發送方向接收方轉移wei的數量

  4. 可選數據域,包括發送合約的消息

  5. STARTGAS:代表transaction執行允許采取的運算步驟的最大數量

  6. GASPRICE:代表發送方願意支付的gas費用

 

  • 消息(message

 

合約可以發送消息給其他的合約。消息是虛擬對象,不能被序列化,隻能存在於以太坊的執行環境下。可以被想象成函數調用。

 

消息包括:

  1. 消息發送方

  2. 消息接收方

  3. VALUE:發送方向接收方轉移wei的數量

  4. 可選數據域:發送到合約的實際數據

  5. STARTGAS:限製消息可以觸發的代碼執行的gas最大值

 

本質上,消息就像transaction,隻不過消息是由合約而不是由外在因素創造的。

 

GAS  

 

當消息或transaction觸發合約執行時,每個指令在每個網絡節點都被執行。這是需要代價的:每個執行的操作都有特定的成本,以一定量的gas單元表現。

 

Gas是transaction發送方需要為每個以太坊區塊鏈上發生的操作所支付的執行費用。Gas名字的靈感來自一個觀點:這筆費用就像加密燃料,驅使智能合約的運行。Gas從執行代碼的礦工處購買以太幣。

 

Gas和以太幣被故意分開,因為Gas單位與自然成本的運算類似,而以太幣的價格是根據市場而波動的。

 

Gas價格實際上由礦工決定,礦工可以拒絕以低於最低限度的gas價格進行transaction。

 

以太坊客戶端會自用使用以太幣購買gas,數量是指定的transaction最大支出。

 

在每個合約執行或每個transaction的運算步驟,以太坊協議都要收費,以防止以太坊網絡上發生蓄意攻擊或濫用。

 

每個transaction都必須包含gas限額和願意支付的gas花費。如果transaction產生的、用於運算步驟的gas總量,包括原始消息和可能引發的子消息,少於或等於gas限額,那麼transaction就會進行;如果總量超過限額,那麼所有變化都會複原,但是transaction仍然有效,礦工可以收集花費,多餘的gas會以以太幣的形式償還給發送方。

 

估算transaction成本:

 

transaction花費的以太幣總量基於兩個因素:

 

  • gasUsed是transaction消費的gas總量

  • gasPrice是gas單元的價格(換算成以太幣)

 

總成本 = gasUsed * gasPrice

 

gasUsed

 

以太坊虛擬機上的每個操作都會被指派消費的gas數量。gasUsed是所有執行的操作所需的gas總額。有個電子表格可以看到背後的一些統計。

 

gasPrice

 

用戶建構並簽署transaction,每個用戶可以說明自己想要的gasPrice,可以是零。然而Frontier發布的以太坊客戶端默認gasPrice是0.05e12 wei。由於礦工會使收入最優化,如果大部分transaction都以0.05e12 wei的gasPrice提交,就很難說服礦工接受價格更低或為0的transaction。

 

示例transaction成本

 

我們來做一個隻添加2個數字的合約。EVM OPCODE ADD消費3gas。

 

大概的成本,以默認gas價格計算 (2016年1月)是:

3 * 0.05e12 = 1.5e11 wei

 

這是個簡化的計算,忽略了一些成本。

 

EVM  

 

EVM:在底層,以太坊基於區塊鏈技術,實現了數據的去中心化、分布式存儲和信息交換的信任問題。同時,以太坊實現了一個叫Ethereum Virtual Machine(EVM)的運行時環境,類似JVM,它的主要工作是執行智能合約(該概念下麵會介紹)的位元組碼。

 

接口:

 

1. Javascript Console:以太坊客戶端會啟動一個相互的console,提供javascript運行環境,可以使用javascript API與節點交互。

2. JSON-RPC server:節點可以啟動json-rpc服務器,從而暴露JSON-RPC API

3.命令行:geth

 

結合以上概念,歸納Ethereum工作流程:

 

以太坊的基礎單元是賬戶,跟蹤每個賬戶的狀態,所有以太坊區塊鏈上的狀態轉換都是賬戶之間價值和信息的轉移。

 

外有賬戶是由人類用戶掌控,因為人類用戶能夠控製私鑰,進而控製外有賬戶。而合約賬戶則是由內部代碼管控。智能合約指的是合約賬戶中的代碼:事務被發送給該賬戶時所運行的程序。用戶可以通過在區塊鏈中部署代碼來創建新的合約。

 

隻有外有賬戶發出事務時,合約賬戶才會執行相應的操作,合約賬戶不可能自發地執行。因為以太坊要求節點能夠與運算結果保持一致,這就要求保證嚴格確定執行。

 

以太坊用戶必須向網絡支付少量事務費用。這可以使以太坊區塊鏈免受無關緊要或惡意的運算任務幹擾,比如分布式拒絕服務(DDoS)攻擊或無限循環。事務的發送者必須在激活的合約賬戶的每一步付款,包括運算和數據存儲。費用通過以太坊Gas結算,以太幣的形式支付。

 

事務費用由節點收集,礦工是以太坊網絡中收集、傳播、確認和執行事務的節點。礦工們將事務分組:以太坊區塊鏈中賬戶狀態的更新被分成的組存儲在區塊中(Block),礦工們會互相競爭,以使各自的區塊(Block)可以添加到區塊鏈的下一個節點上。礦工們每挖到一個成功的區塊就會得到以太幣獎勵,這就為礦工帶來了經濟激勵,促使礦工為以太坊網絡貢獻硬件和電力。

 

礦工們通過解決複雜數學問題的任務以便成功地挖到區塊(Block)。這被稱為工作量證明(PoW)。一個運算問題,如果在算法上解決,比驗證解決方法需要更多數量級的資源,那麼它就是工作證明的最好選擇。為防止比特幣網絡中已經發生的專用硬件(例如特定用途集成電路)造成的中心化現象,以太坊選擇了難以存儲的運算問題。這就使以太坊的工作量證明具有抗特定用途集成電路性,和比特幣這種由專門硬件控製挖礦的區塊鏈相比,能夠帶來更加去中心化的安全分布。

 

 三、以太坊開發  搭建本地測試網絡  

 

為了搭建本地測試網絡,需要完成三件工作:

  • 構建geth客戶端

  • 構建solidity編譯器

  • 運行geth客戶端

 

以下就分別開始介紹。

 

Ethereum客戶端類似於Java虛擬機,按照黃皮書執行;項目早期,在不同的操作係統中就有多個可以彼此協作的客戶端實現:go-ethereum、cpp-ethereum、pyethapp、ruby-ethereum等等。

 

進入Homestead階段後,Go客戶端(geth)占據了主導地位,因此我們也采用go-ethereum完成測試網絡的搭建。

 

1. 首先在選擇的目錄下clone客戶端代碼go-ethereum

 

20161117103243451.jpg

 

2. 構建geth前需要安裝額外庫:

 

mac係統:

20161117103256424.jpg

 

ubuntu係統:

 

3. 最後,就可以使用以下命令編譯geth了:

 

20161117103312398.jpg
 

編譯成功生成build/bin/geth

 

現在進入構建solidity編譯器(源碼安裝)的流程:

 

1. 首先在選擇的目錄下clone solidity的編譯器代碼

 

20161117103333664.jpg

 

2. 安裝依賴

 

20161117103356286.jpg

 

3. 最後,就可以使用以下命令編譯solc了

 

20161117103421464.jpg

 

geth和solc編譯完成後,重新回到go-ethereum代碼根目錄

 

20161117103457241.jpg

 

1. 創建初始區塊:

 

初始區塊是區塊鏈的起始:第一個區塊,區塊0,唯一沒有指向前麵區塊的一個區塊。除非與其他節點具有相同的初始區塊,協議確保了這些節點不會和該區塊鏈一致。這樣就可以創建任意的私有測試網絡區塊鏈。

 

20161117103516943.jpg

 

20161117103529516.jpg

 

2. 啟動geth:

 

20161117103542552.jpg

 

下麵介紹上述命令中的主要參數:

 

1. --nodiscover:使用這個命令可以確保你的節點不會被非手動添加你的人發現。否則,你的節點可能被陌生人的區塊鏈無意添加,如果他和你有相同的初始文件和網絡ID。

 

2. --rpc:可以激活你節點上的RPC接口。它在geth中通常被默認激活。

 

3. --rpcapi:這個命令可以決定允許什麼API通過RPC進入。在默認情況下,geth可以在RPC激活web3界麵。

 

4. --rpcport:改變RPC上的開放端口。

 

5. --rpccorsdomain “*”:可以指示什麼URL能連接到你的節點來執行RPC定製端任務。

 

6. --datadir “test/chain”:私有鏈數據所儲存在的數據目錄

 

7. --identity:為節點設置一個身份,使之更容易在端點列表中被辨認出來。

 

8. --solc:製定solc編譯器

 

智能合約  

 

編寫智能合約的高級語言有:solidity、serpent、LLL、Mutan。

 

  • Solidity類似於Javascript,也是目前最流行的。

  • Serpent類似於Python。

  • LLL是類似於匯編的底層語言。

  • Mutan是C-like的編程語言,不過已經被廢棄了。

 

我們以multiply為例開始第一個Solidity的智能合約。

 

  • 第一步:創建一個EOA用戶並設置密碼

 

20161117103603833.jpg
 

  • 第二步:查看新用戶的餘額,並且開始挖礦

 

20161117103618784.jpg

 

  • 第三步:新建一個命令窗口,並連接到正在挖礦的窗口

 

20161117103632885.jpg

 

  • 第四步:確認用戶餘額有所增加

 

20161117103649871.jpg

 

  • 第五步:編譯

 

合約代碼如下:

 

contract test {

  function multiply(uint a) returns(uint d) {

    return a * 7;

  }

}

 

20161117103704717.jpg
 

首先將合約test賦值變量source,然後使用solidity編譯器進行編譯,將返回結果賦值給contract。

 

下麵簡要描述一下contract的字段:

 

  • code: 編譯的以太坊虛擬機字節代碼

  • info: 從編譯器輸出的額外元數據

  • source:源代碼

  • language: 合約語言(Solidity、Serpent、LLL)

  • languageVersion:合約語言版本

  • compilerVersion:編譯器版本號

  • abiDefinition:應用的二進製接口定義

 

  • 第六步:部署合約

 

確保有解鎖的賬戶和資金,部署完成後,在區塊鏈上就會創建一個合約。這一步驟是需要支付執行的。一旦transaction成功進入區塊,賬戶餘額會根據以太坊虛擬機的gas規則被扣減。

 

20161117103739813.jpg

 

  • 第七步:與合約交互

 

與合約交互典型做法是使用eth.contract()功能的抽象層,它會返回javascript對象。描述合約可用功能的標準方法是ABI定義。

 

20161117103751515.jpg
 

當sendTransaction被調用時,功能調用通過發送transaction來執行。需要花費以太幣發送,記錄會永久記錄在區塊鏈上。這種方式返回的是transaction散列。

 

當call被調用時,功能在以太坊虛擬機本地執行。用這種方式進行的調用不會記錄在區塊鏈上,因此不會改變合約內部狀態。這種調用方式被稱為恒定功能調用,不花費以太幣。

 

最後,有興趣的朋友,也可以嚐試testrpc和truffle,更加方便。

 

聲明:文中關於“Ethereum Homestead 0.1 documentation”來自ethereum社區如想了解更多,可通過ethereum社區官網進一步學習。

 

Q&A  

 

Q1:一次交易都要在以太坊的所有節點的EVM上執行一遍嗎?

A1:是的。區塊鏈其實是比較昂貴的,它的目的不是為了提升效率。在Ethereum Homestead裏是這樣描述的:Each and every full node in the network does the same calculations and stores the same values. Clearly Ethereum is not about optimising efficiency of computation. Its parallel processing is redundantly parallel. 

 

Q2:哪些公司用以太坊做開發基礎?

A2:國內的金丘股份,萬向區塊鏈實驗室,眾安保險,螞蟻金服。

 

Q3:智能合約的代碼量最大是1M嗎?也就是一個區塊的大小?

A3:1M是比特幣的區塊限製。

 

Q4:以太坊同步一次要多久?

A4: 比特幣區塊鏈的大小約為84.9GB,現在以太坊的區塊鏈還比較小,第一次同步的時候,持續的十個小時左右,於網絡速率有關。

 

Q5:如果由於網絡中斷,導致出現兩條鏈,當網絡恢複後,如何合並這兩條鏈?

A5:不會合並的。最終還是拚的算力。

(接上一問)

Q6:這樣不是會導致很多分叉嗎?

A6:短時間是可能存在分叉的,但最終不會有分叉存在,例如比特幣”為了防止該區塊因為子鏈太短而被其它節點拋棄,那麼還得等產生6個新的後續區塊,才能最終確認該transaction已經被可靠地寫入區塊鏈中。即,確保可靠寫入,需要約60分鍾。 ”版本升級時,是有可能存在分叉問題的,因為有些礦工不願意升級。

 

Q7:如果智能合約太大,無法在一個區塊中寫入,以太坊如何操作?

A7:因為合約之間可以通過消息調用,所以可以把代碼拆開,分別deploy。當然前提是真得有這麼大的合約。


原文發布時間為:2016-11-17  本文來自雲棲社區合作夥伴DBAplus

最後更新:2017-05-11 11:31:11

  上一篇:go  myeclipse構建MAVEN
  下一篇:go  35 個 Java 代碼性能優化總結