來源:DBAplus社群 時間:2017-01-18 10:22:24 作者:邢有濤
本文根據(jù)DBAplus社群第81期線上分享整理而成
近年來,“區(qū)塊鏈”技術(shù)迅速走紅,其去中心化、去信任的機制得到全球市場的認同,并有望成為下一代“價值互聯(lián)網(wǎng)”的基礎(chǔ)協(xié)議。因此,借這樣的機會,首先給大家介紹一下什么是區(qū)塊鏈,然后分享當下很流行的以太坊,最后完成一個簡單的智能合約,幫助大家對區(qū)塊鏈技術(shù)有一些初步的了解。
本次分享將包括以下三部分:
1.區(qū)塊鏈入門
2.以太坊介紹
3.以太坊開發(fā)
? a. 構(gòu)建測試網(wǎng)絡(luò)
? b. 編寫合約
一、區(qū)塊鏈入門
簡單來說,區(qū)塊鏈是比特幣的底層技術(shù)。談到區(qū)塊鏈,就不得不先說一下比特幣。對于“比特幣(Bitcoin)”這個詞,有三層含義。首先,比特幣特指一種加密數(shù)字貨幣,是最早也是目前規(guī)模最大的加密數(shù)字貨幣。其次,比特幣協(xié)議可以被看成一種基于區(qū)塊鏈的“價值傳輸協(xié)議”,該協(xié)議可以用來描述數(shù)字資產(chǎn)是如何在區(qū)塊鏈上轉(zhuǎn)移的。最后,比特幣系統(tǒng)指底層的共有區(qū)塊鏈技術(shù)平臺,包含去中心化的公開總帳、比特幣錢包等軟件和系統(tǒng)。
?加密數(shù)字貨幣
比特幣(Bitcoin)是一種全球通用的加密電子貨幣(Crypto-Currency),完全交由用戶們自治的交易工具。比特幣的概念由中本聰(Satoshi Nakamoto)在2008年11月發(fā)表的論文《Bitcoin:A Peer-to-Peer Electronic Cash System》中首次提出。與數(shù)字貨幣不同,比特幣完全是去中心化的,不依靠特定機構(gòu)來發(fā)行,而是依據(jù)特定算法,通過大量的計算產(chǎn)生。比特幣系統(tǒng)使用整個P2P網(wǎng)絡(luò)中眾多節(jié)點構(gòu)成的分布式數(shù)據(jù)庫對所有的事務(wù)進行確認并記錄,并使用密碼學的設(shè)計來確保貨幣流通各個環(huán)節(jié)安全性。
?比特幣協(xié)議
1.共用標準:包括散列算法(Hash)、Merkle樹結(jié)構(gòu)、簽名方式、事務(wù)驗證、地址格式等。
共用結(jié)構(gòu):包括消息、可變長整數(shù)、可變長字符串,網(wǎng)絡(luò)地址、清單向量(Inventory Vectors)、區(qū)塊頭格式等。
2.消息類型:包括 version、verack、addr、inv、getdata,getblocks,getheaders,tx,block,headers,getaddr,checkorder,submitorder,reply,ping,alert 這 16 個消息報文的具體定義。
3.事務(wù)腳本
?比特幣系統(tǒng)
1.用戶:用戶通過密鑰控制比特幣錢包。
2.事務(wù):每一筆事務(wù)都會被廣播到整個比特幣網(wǎng)絡(luò)中,由礦工將其寫入新的區(qū)塊。
3.礦工:通過競爭計算生成在每個節(jié)點達成共識的區(qū)塊鏈。
4.區(qū)塊鏈:是一個分布式的公共權(quán)威賬簿,包含了比特幣網(wǎng)絡(luò)發(fā)生的所有的事務(wù)。
盡管比特幣P2P網(wǎng)絡(luò)中的各個節(jié)點相互對等,但是根據(jù)所提供的功能不同,各節(jié)點可能具有不同的分工。每個比特幣節(jié)點都是路由、區(qū)塊鏈數(shù)據(jù)庫、挖礦、錢包服務(wù)的功能集合。一個全節(jié)點(Full Node)包括錢包、完整區(qū)塊鏈、礦工、網(wǎng)絡(luò)路由節(jié)點四個功能。
現(xiàn)在我們重新回到區(qū)塊鏈的話題上來。
?什么是區(qū)塊鏈?
區(qū)塊鏈(Blockchain)是指通過去中心化和去信任的方式集體維護一個可靠數(shù)據(jù)庫的技術(shù)方案。該技術(shù)方案讓參與系統(tǒng)中的任意多個節(jié)點,把一段時間系統(tǒng)內(nèi)全部事務(wù)通過密碼學算法計算并記錄到一個數(shù)據(jù)塊(block),生成該數(shù)據(jù)塊的hash用于鏈接下個數(shù)據(jù)塊,系統(tǒng)所有參與節(jié)點來共同檢驗記錄是否為真,并且每個區(qū)塊的內(nèi)容都由后續(xù)子鏈上的區(qū)塊來保證其內(nèi)容不可被篡改。各個參與節(jié)點可以在新區(qū)塊產(chǎn)生確認及獎勵分配上達成共識,從而逐漸形成的一個龐大、去中心化的公開賬本。
鏈上的每個區(qū)塊都可以用來記錄貨幣、股權(quán)、債券、數(shù)字簽名、數(shù)字合約,或其它任何數(shù)字化內(nèi)容。在全球網(wǎng)絡(luò)下,由無數(shù)獨立的計算機來維護、更新和核查,確保記賬結(jié)果的公平、公正和公開透明,而無需任何中心化機構(gòu)的審核和維護。
我們?nèi)匀?strong>以比特幣為例,說明區(qū)塊鏈形成過程:
?平均每10分鐘由“礦工”競爭而產(chǎn)生一個新的區(qū)塊,并把這段時間內(nèi)的多筆事務(wù)記錄到這個新區(qū)塊中。單筆事務(wù)寫入比特幣區(qū)塊鏈至少需要10分鐘。
?目前每個區(qū)塊大小限制為1MB,最多能記錄約4000筆的事務(wù)。比特幣區(qū)塊鏈最大寫入性能大約只有7筆/秒。
?為了防止該區(qū)塊因為子鏈太短而被其它節(jié)點拋棄,需要等待產(chǎn)生6個新的后續(xù)區(qū)塊,才能最終確認該事務(wù)已經(jīng)被可靠地寫入?yún)^(qū)塊鏈中。確??煽繉懭胄枰s60分鐘。
?每個參與節(jié)點都可以保存整個區(qū)塊鏈的副本。只要有參與節(jié)點存在,區(qū)塊鏈數(shù)據(jù)就不會丟失。
那么,在這樣去信任的場景下,該由誰完成賬本的記錄(即新區(qū)塊的產(chǎn)生)。為了解決這個問題,必須建立一套共識機制,確保價值的唯一性和不可復制性。目前常見的包括PoW(Proof of Work,工作量證明),PoS(Proof of Stake,權(quán)益證明),DPoS(Delegate Proof of Stake,股份授權(quán)證明機制)等。
?PoW
比特幣區(qū)塊鏈主要使用PoW來實現(xiàn)共識。通過使用單向函數(shù)挖掘,使得礦工在得到正確的計算結(jié)果前,必須經(jīng)過公開算法的計算,而結(jié)果的驗證速度非常快。通過驗證這個結(jié)果,其他礦工就可以確認是執(zhí)行了一定量的計算工作才得出的。
PoW的優(yōu)點是:完全去中心化,節(jié)點自由進出。
?PoS
PoS權(quán)益證明,可以看作是PoW的一種升級共識機制,根據(jù)每個節(jié)點所占代幣的比例和時間等比例的降低挖礦難度,從而加快找隨機數(shù)的速度。當創(chuàng)造一個PoS區(qū)塊時,礦工需要創(chuàng)建一個幣權(quán)交易,事務(wù)會按設(shè)定的比例把一些幣發(fā)送給礦工。
PoS權(quán)益證明方式在一定程度上縮短達成共識的時間,但是仍然需要挖礦的過程才能達成共識。PoS幣的規(guī)則會造成富者愈富的問題。PoS幣的利息越高,那么該幣將會產(chǎn)生的不公平性就會越高。
?DPoS
DPoS類似于董事會投票,它的原理是讓每一個持有比特股的人進行投票,由此產(chǎn)生101位代表可以將其理解為101個超級節(jié)點或者礦池,而超級節(jié)點彼此的權(quán)利是完全相等的。DPoS有點像是美國的議會制度,如果代表不能履行他們的職責(無法生成區(qū)塊),即被除名,網(wǎng)絡(luò)會選出新的超級節(jié)點來取代他們。
DPoS可以大幅縮小參與驗證和記賬節(jié)點的數(shù)量,可以達到秒級的共識驗證。
?公有鏈、私有鏈、聯(lián)盟鏈
中本聰巧妙地將以下幾個成熟的技術(shù)和理論組合的一起,并以此為基礎(chǔ)構(gòu)建區(qū)塊鏈技術(shù):
?基于去中心化的分布式算法而建立起點對點對等(P2P)網(wǎng)絡(luò)。
?基于非對稱加密算法。
?基于分布式一致性算法,解決了分布式場景下的拜占庭將軍問題。
?基于博弈論而精心設(shè)計的獎勵機制,實現(xiàn)了納什均衡,確保整個系統(tǒng)的安全和穩(wěn)定運行。
如果同時具有上述四點要素,可以認為這是一種公共區(qū)塊鏈技術(shù),簡稱公有鏈。如果只具有前三點要素,將其稱為私有區(qū)塊鏈技術(shù),簡稱私有鏈。而聯(lián)盟鏈則介于兩者之間,可視為聯(lián)盟成員內(nèi)的一種私有鏈。這里主要介紹公有鏈和私有鏈。
公有鏈是指全世界任何人都可讀取的、任何人都能發(fā)送事務(wù)且能獲得有效確認的、任何人都能參與共識過程的區(qū)塊鏈。共識過程決定哪個區(qū)塊可被添加到區(qū)塊鏈中和明確當前狀態(tài)。作為中心化或者準中心化信任的替代物,公有鏈的安全由加密數(shù)字經(jīng)濟維護。加密數(shù)字經(jīng)濟采取工作量證明機制或權(quán)益證明機制等方式,將經(jīng)濟獎勵和加密數(shù)字驗證結(jié)合了起來,并遵循著一般原則:每個人從中可獲得的經(jīng)濟獎勵,與對共識過程作出的貢獻成正比。這些區(qū)塊鏈通常被認為是完全去中心化的。
私有鏈是指其寫入權(quán)限僅在一個組織手里的區(qū)塊鏈。讀取權(quán)限或者對外開放,或者被限制。相關(guān)的應(yīng)用囊括數(shù)據(jù)庫管理、審計、甚至一個公司,盡管在有些情況下希望它能有公共的可審計性,但在很多的情形下,公共的可讀性并非是必須的。
?私有鏈相比于公有鏈的優(yōu)點:
1.事務(wù)的效率更高:比特幣區(qū)塊鏈目前每秒可完成7筆事務(wù),而私有鏈目前最高可以到每秒10萬筆,并且還有提高的空間。顯然后者更適應(yīng)現(xiàn)實世界金融事務(wù)的需求。
2.事務(wù)可以回滾:這點對于中心化機構(gòu)也很重要,在某些情況下,某些事務(wù)會因為錯誤或法律的問題而被要求修改、撤銷。
3.事務(wù)費用更低:目前公有鏈的事務(wù)費用是每筆0.10美元,而且隨著時間流逝幣值趨于增長,導致事務(wù)費用也在增長。而私有鏈的事務(wù)費用將會降低一到兩個數(shù)量級。
4.仍然是基于分布式網(wǎng)絡(luò),保留了分布式記賬系統(tǒng)的優(yōu)點。
5.提供了更好的隱私保護:公有區(qū)塊鏈因為其透明共享總賬本的設(shè)計,本身不提供隱私保護功能。而私有鏈可以對讀取權(quán)限進行限制,從而提供更好的隱私保護。
6.驗證者是公開透明的,不存在一些礦工出于共謀原因而致的51%攻擊風險。
7.節(jié)點可以很好地連接:節(jié)點互相可以很好地連接,故障可以迅速通過人工干預來修復,并允許使用共識算法減少區(qū)塊時間,從而更快完成事務(wù)。
?私有鏈的缺點:
1.違背了區(qū)塊鏈去中心化的本質(zhì),重新引入了若干“信任節(jié)點”;
2.其參與者需要經(jīng)過審核和驗證,從而嚴格限制了其規(guī)模,其安全性容易受到威脅。因此,私有區(qū)塊鏈更適合為傳統(tǒng)機構(gòu)所用。
?公有鏈的優(yōu)點:
1.保護用戶:免受開發(fā)者的影響——在公共區(qū)塊鏈中的用戶更多、更廣泛,程序開發(fā)者無權(quán)干涉
用戶的使用方式。反過來說,區(qū)塊鏈可以保護使用這些程序的用戶。
2.網(wǎng)絡(luò)規(guī)模效應(yīng)——公共區(qū)塊鏈是開放的,因此有可能被許多外界用戶使用和產(chǎn)生一定的網(wǎng)絡(luò)效應(yīng)。而在公有鏈上運行的應(yīng)用越多,節(jié)點越多,那么該區(qū)塊鏈條也會越可信。
因此使用公有鏈,還是私有鏈,完全根據(jù)需求而定。
?區(qū)塊鏈的演進
區(qū)塊鏈1.0:可編程的數(shù)字貨幣
比特幣的發(fā)明人Satoshi Nakamoto在其2008.11年發(fā)表的論文《BitCoin:A Peer-to-Peer Electronic Cash System》中指出:“區(qū)塊鏈是指通過去中心化和去信任的方式集體維護一個可靠數(shù)據(jù)庫的技術(shù)方案。”
區(qū)塊鏈 1.0 的主要應(yīng)用領(lǐng)域為“加密數(shù)字貨幣”,包括貨幣的發(fā)行機制、分配機制、幣值調(diào)節(jié)機制等。
比特幣可視為區(qū)塊鏈的首個在金融支付領(lǐng)域中的應(yīng)用。比特幣所產(chǎn)生和使用的區(qū)塊鏈,是最早也是目前應(yīng)用最廣泛的公有區(qū)塊鏈。
區(qū)塊鏈2.0:可編程的智能合約
在2015年10月召開的“2015首屆全球區(qū)塊鏈峰會”上,以太坊的創(chuàng)始人Vitalik Buterin發(fā)表了題為《Visions, Part 1: The Value of Blockchain Technology》主題演講,并重新定義了區(qū)塊鏈:“一個區(qū)塊鏈就是一個任何人都可以上傳程序并使其自己執(zhí)行的神奇電腦,每個程序的當前和所有過去狀態(tài)都是公共可見的,強大的密碼經(jīng)濟學保證程序能夠按照該區(qū)塊鏈協(xié)議所定義的方式持續(xù)執(zhí)行。”
區(qū)塊鏈成為一種“信任的機器”,通過自我限制和安全加密,確保機器能安全可信地自動執(zhí)行預設(shè)的邏輯。
區(qū)塊鏈2.0的主要應(yīng)用領(lǐng)域為智能合約。智能合約能夠令各方自動執(zhí)行操作,結(jié)果由軟件驗證,而非人類扮演中介。
?典型應(yīng)用:
1.股權(quán)、債權(quán)合約
2.證券與金融合約
3.互助保險合約
4.權(quán)利登記、轉(zhuǎn)讓
5.博彩
6.防偽
7.物聯(lián)網(wǎng)
區(qū)塊鏈3.0:可編程的社會治理
?區(qū)塊鏈3.0目前沒有嚴格的定義,總的來說有兩大類應(yīng)用:
1.超越貨幣、經(jīng)濟、市場的公正性應(yīng)用。
2.超越貨幣、經(jīng)濟、市場的效率和協(xié)作。
?區(qū)塊鏈3.0的主要應(yīng)用領(lǐng)域為社會治理:
1.公證、見證
2.司法仲裁
3.投票
4.健康管理
5.人工智能
6.去中心化自治組織
7.身份認證
二、區(qū)塊鏈2.0:以太坊Ethereum
Ethereum以太坊是運行在區(qū)塊鏈技術(shù)上的開放平臺,使開發(fā)人員能夠建立和發(fā)布下一代分布式應(yīng)用DApp。
Ethereum可以用來編程、分散、擔保和交易任何事物:投票、域名、金融交易、眾籌、公司管理、合約、知識產(chǎn)權(quán)、硬件集成的智能資產(chǎn)。
區(qū)塊鏈2.0重要的是智能合約、智能資產(chǎn),而智能合約領(lǐng)域最有影響力的開發(fā)平臺就是以太坊。
?應(yīng)用場景實例
自行車的所有者會將一個Slock(智能鎖)安裝到他們的自行車上,并且在以太坊區(qū)塊鏈上給自行車注冊一個智能合約(一段程序代碼)。接下來,任何人都可以向該智能合約發(fā)起一個發(fā)送一定數(shù)量數(shù)字貨幣的請求,合約在接到這個請求之后,會自動將這筆數(shù)字貨幣轉(zhuǎn)發(fā)給自行車的所有者,這樣發(fā)送者可以獲得2個小時的使用權(quán)。
?基本概念
挖礦
挖礦這個詞源于對加密貨幣與黃金的類比。黃金或貴金屬很稀有,電子代幣也是,增加總量的唯一方法就是挖礦;同時,挖礦也是通過在區(qū)塊鏈中創(chuàng)建、驗證、發(fā)行和傳播區(qū)塊的方法來保護網(wǎng)絡(luò)的。
挖以太幣 = 保護網(wǎng)絡(luò) = 驗證計算
以太坊,與所有的區(qū)塊鏈技術(shù)一樣,使用激勵驅(qū)動的安全模式。共識基于選擇具有最高總難度的區(qū)塊。礦工創(chuàng)建區(qū)塊,其他人檢測有效性。
外部賬戶 vs 合約賬戶
1.外部賬戶(EOA)
2.存儲以太幣余額
3.發(fā)送transaction(以太幣交易或觸發(fā)合約代碼)
4.私鑰控制
5.沒有代碼
合約賬戶
1.存儲以太幣余額
2.相關(guān)代碼
3.執(zhí)行代碼(被其他合約的transaction或消息觸發(fā))
4.執(zhí)行任意復雜的操作;操作自己的永久存儲
以太坊區(qū)塊鏈上的所有行為都是由外部賬戶通過transaction觸發(fā)的。每當合約賬戶接收到transaction,就按照輸入?yún)?shù)的指示執(zhí)行。合約代碼是由參與到網(wǎng)絡(luò)的每個節(jié)點上的以太坊虛擬機執(zhí)行。
代碼執(zhí)行的唯一語境是區(qū)塊鏈上區(qū)塊的位置和所有可見的數(shù)據(jù)。區(qū)塊鏈的區(qū)塊代表時間單位,區(qū)塊鏈本身是時間維度,代表在鏈上區(qū)塊制定的離散時間點上狀態(tài)的整個歷史。
所有以太幣余額和價值都以wei為單位:1 ether = 1e18 wei
事務(wù)(transaction)
transaction在以太坊里指被簽名的數(shù)據(jù)包,數(shù)據(jù)包存儲著從外部賬戶發(fā)送到區(qū)塊鏈上另一賬戶的消息。
transaction包括:
1.消息接收人
2.簽名:用于確認發(fā)送方身份和發(fā)送消息的意圖
3.VALUE:發(fā)送方向接收方轉(zhuǎn)移wei的數(shù)量
4.可選數(shù)據(jù)域,包括發(fā)送合約的消息
5.STARTGAS:代表transaction執(zhí)行允許采取的運算步驟的最大數(shù)量
6.GASPRICE:代表發(fā)送方愿意支付的gas費用
消息(message)
合約可以發(fā)送消息給其他的合約。消息是虛擬對象,不能被序列化,只能存在于以太坊的執(zhí)行環(huán)境下??梢员幌胂蟪珊瘮?shù)調(diào)用。
消息包括:
1.消息發(fā)送方
2.消息接收方
3.VALUE:發(fā)送方向接收方轉(zhuǎn)移wei的數(shù)量
4.可選數(shù)據(jù)域:發(fā)送到合約的實際數(shù)據(jù)
5.STARTGAS:限制消息可以觸發(fā)的代碼執(zhí)行的gas最大值
本質(zhì)上,消息就像transaction,只不過消息是由合約而不是由外在因素創(chuàng)造的。
?GAS
當消息或transaction觸發(fā)合約執(zhí)行時,每個指令在每個網(wǎng)絡(luò)節(jié)點都被執(zhí)行。這是需要代價的:每個執(zhí)行的操作都有特定的成本,以一定量的gas單元表現(xiàn)。
Gas是transaction發(fā)送方需要為每個以太坊區(qū)塊鏈上發(fā)生的操作所支付的執(zhí)行費用。Gas名字的靈感來自一個觀點:這筆費用就像加密燃料,驅(qū)使智能合約的運行。Gas從執(zhí)行代碼的礦工處購買以太幣。
Gas和以太幣被故意分開,因為Gas單位與自然成本的運算類似,而以太幣的價格是根據(jù)市場而波動的。
Gas價格實際上由礦工決定,礦工可以拒絕以低于最低限度的gas價格進行transaction。
以太坊客戶端會自用使用以太幣購買gas,數(shù)量是指定的transaction最大支出。
在每個合約執(zhí)行或每個transaction的運算步驟,以太坊協(xié)議都要收費,以防止以太坊網(wǎng)絡(luò)上發(fā)生蓄意攻擊或濫用。
每個transaction都必須包含gas限額和愿意支付的gas花費。如果transaction產(chǎn)生的、用于運算步驟的gas總量,包括原始消息和可能引發(fā)的子消息,少于或等于gas限額,那么transaction就會進行;如果總量超過限額,那么所有變化都會復原,但是transaction仍然有效,礦工可以收集花費,多余的gas會以以太幣的形式償還給發(fā)送方。
估算transaction成本:
transaction花費的以太幣總量基于兩個因素:
?gasUsed是transaction消費的gas總量
?gasPrice是gas單元的價格(換算成以太幣)
總成本 = gasUsed * gasPrice
gasUsed
以太坊虛擬機上的每個操作都會被指派消費的gas數(shù)量。gasUsed是所有執(zhí)行的操作所需的gas總額。有個電子表格可以看到背后的一些統(tǒng)計。
gasPrice
用戶建構(gòu)并簽署transaction,每個用戶可以說明自己想要的gasPrice,可以是零。然而Frontier發(fā)布的以太坊客戶端默認gasPrice是0.05e12 wei。由于礦工會使收入最優(yōu)化,如果大部分transaction都以0.05e12 wei的gasPrice提交,就很難說服礦工接受價格更低或為0的transaction。
示例transaction成本
我們來做一個只添加2個數(shù)字的合約。EVM OPCODE ADD消費3gas。
大概的成本,以默認gas價格計算 (2016年1月)是:
3 * 0.05e12 = 1.5e11 wei
這是個簡化的計算,忽略了一些成本。
?EVM
EVM:在底層,以太坊基于區(qū)塊鏈技術(shù),實現(xiàn)了數(shù)據(jù)的去中心化、分布式存儲和信息交換的信任問題。同時,以太坊實現(xiàn)了一個叫Ethereum Virtual Machine(EVM)的運行時環(huán)境,類似JVM,它的主要工作是執(zhí)行智能合約(該概念下面會介紹)的位元組碼。
接口:
1. Java Console:以太坊客戶端會啟動一個相互的console,提供java運行環(huán)境,可以使用java API與節(jié)點交互。
2. JSON-RPC server:節(jié)點可以啟動json-rpc服務(wù)器,從而暴露JSON-RPC API
3.命令行:geth
結(jié)合以上概念,歸納Ethereum工作流程:
以太坊的基礎(chǔ)單元是賬戶,跟蹤每個賬戶的狀態(tài),所有以太坊區(qū)塊鏈上的狀態(tài)轉(zhuǎn)換都是賬戶之間價值和信息的轉(zhuǎn)移。
外有賬戶是由人類用戶掌控,因為人類用戶能夠控制私鑰,進而控制外有賬戶。而合約賬戶則是由內(nèi)部代碼管控。智能合約指的是合約賬戶中的代碼:事務(wù)被發(fā)送給該賬戶時所運行的程序。用戶可以通過在區(qū)塊鏈中部署代碼來創(chuàng)建新的合約。
只有外有賬戶發(fā)出事務(wù)時,合約賬戶才會執(zhí)行相應(yīng)的操作,合約賬戶不可能自發(fā)地執(zhí)行。因為以太坊要求節(jié)點能夠與運算結(jié)果保持一致,這就要求保證嚴格確定執(zhí)行。
以太坊用戶必須向網(wǎng)絡(luò)支付少量事務(wù)費用。這可以使以太坊區(qū)塊鏈免受無關(guān)緊要或惡意的運算任務(wù)干擾,比如分布式拒絕服務(wù)(DDoS)攻擊或無限循環(huán)。事務(wù)的發(fā)送者必須在激活的合約賬戶的每一步付款,包括運算和數(shù)據(jù)存儲。費用通過以太坊Gas結(jié)算,以太幣的形式支付。
事務(wù)費用由節(jié)點收集,礦工是以太坊網(wǎng)絡(luò)中收集、傳播、確認和執(zhí)行事務(wù)的節(jié)點。礦工們將事務(wù)分組:以太坊區(qū)塊鏈中賬戶狀態(tài)的更新被分成的組存儲在區(qū)塊中(Block),礦工們會互相競爭,以使各自的區(qū)塊(Block)可以添加到區(qū)塊鏈的下一個節(jié)點上。礦工們每挖到一個成功的區(qū)塊就會得到以太幣獎勵,這就為礦工帶來了經(jīng)濟激勵,促使礦工為以太坊網(wǎng)絡(luò)貢獻硬件和電力。
礦工們通過解決復雜數(shù)學問題的任務(wù)以便成功地挖到區(qū)塊(Block)。這被稱為工作量證明(PoW)。一個運算問題,如果在算法上解決,比驗證解決方法需要更多數(shù)量級的資源,那么它就是工作證明的最好選擇。為防止比特幣網(wǎng)絡(luò)中已經(jīng)發(fā)生的專用硬件(例如特定用途集成電路)造成的中心化現(xiàn)象,以太坊選擇了難以存儲的運算問題。這就使以太坊的工作量證明具有抗特定用途集成電路性,和比特幣這種由專門硬件控制挖礦的區(qū)塊鏈相比,能夠帶來更加去中心化的安全分布。
三、以太坊開發(fā)
?搭建本地測試網(wǎng)絡(luò)
為了搭建本地測試網(wǎng)絡(luò),需要完成三件工作:
?構(gòu)建geth客戶端
?構(gòu)建solidity編譯器
?運行g(shù)eth客戶端
以下就分別開始介紹。
Ethereum客戶端類似于Java虛擬機,按照黃皮書執(zhí)行;項目早期,在不同的操作系統(tǒng)中就有多個可以彼此協(xié)作的客戶端實現(xiàn):go-ethereum、cpp-ethereum、pyethapp、ruby-ethereum等等。
進入Homestead階段后,Go客戶端(geth)占據(jù)了主導地位,因此我們也采用go-ethereum完成測試網(wǎng)絡(luò)的搭建。
1. 首先在選擇的目錄下clone客戶端代碼go-ethereum
2. 構(gòu)建geth前需要安裝額外庫:
mac系統(tǒng):
建議使用gvm管理go的版本:參見-http://m.yongsiang.cn
ubuntu系統(tǒng):
參見-http://m.yongsiang.cn
3. 最后,就可以使用以下命令編譯geth了:
編譯成功生成build/bin/geth
現(xiàn)在進入構(gòu)建solidity編譯器(源碼安裝)的流程:
1. 首先在選擇的目錄下clone solidity的編譯器代碼
2. 安裝依賴
3. 最后,就可以使用以下命令編譯solc了
geth和solc編譯完成后,重新回到go-ethereum代碼根目錄
1. 創(chuàng)建初始區(qū)塊:
初始區(qū)塊是區(qū)塊鏈的起始:第一個區(qū)塊,區(qū)塊0,唯一沒有指向前面區(qū)塊的一個區(qū)塊。除非與其他節(jié)點具有相同的初始區(qū)塊,協(xié)議確保了這些節(jié)點不會和該區(qū)塊鏈一致。這樣就可以創(chuàng)建任意的私有測試網(wǎng)絡(luò)區(qū)塊鏈。
2. 啟動geth:
下面介紹上述命令中的主要參數(shù):
1. --nodiscover:使用這個命令可以確保你的節(jié)點不會被非手動添加你的人發(fā)現(xiàn)。否則,你的節(jié)點可能被陌生人的區(qū)塊鏈無意添加,如果他和你有相同的初始文件和網(wǎng)絡(luò)ID。
2. --rpc:可以激活你節(jié)點上的RPC接口。它在geth中通常被默認激活。
3. --rpcapi:這個命令可以決定允許什么API通過RPC進入。在默認情況下,geth可以在RPC激活web3界面。
4. --rpcport:改變RPC上的開放端口。
5. --rpccorsdomain “*”:可以指示什么URL能連接到你的節(jié)點來執(zhí)行RPC定制端任務(wù)。
6. --datadir “test/chain”:私有鏈數(shù)據(jù)所儲存在的數(shù)據(jù)目錄
7. --identity:為節(jié)點設(shè)置一個身份,使之更容易在端點列表中被辨認出來。
8. --solc:制定solc編譯器
?智能合約
編寫智能合約的高級語言有:solidity、serpent、LLL、Mutan。
?Solidity類似于Java,也是目前最流行的。
?Serpent類似于Python。
?LLL是類似于匯編的底層語言。
?Mutan是C-like的編程語言,不過已經(jīng)被廢棄了。
我們以multiply為例開始第一個Solidity的智能合約。
第一步:創(chuàng)建一個EOA用戶并設(shè)置密碼
第二步:查看新用戶的余額,并且開始挖礦
第三步:新建一個命令窗口,并連接到正在挖礦的窗口
第四步:確認用戶余額有所增加
第五步:編譯
合約代碼如下:
contract test {
function multiply(uint a) returns(uint d) {
return a * 7;
}
}
首先將合約test賦值變量source,然后使用solidity編譯器進行編譯,將返回結(jié)果賦值給contract。
下面簡要描述一下contract的字段:
?code: 編譯的以太坊虛擬機字節(jié)代碼
?info: 從編譯器輸出的額外元數(shù)據(jù)
?source:源代碼
?language: 合約語言(Solidity、Serpent、LLL)
?languageVersion:合約語言版本
?compilerVersion:編譯器版本號
?abiDefinition:應(yīng)用的二進制接口定義
第六步:部署合約
確保有解鎖的賬戶和資金,部署完成后,在區(qū)塊鏈上就會創(chuàng)建一個合約。這一步驟是需要支付執(zhí)行的。一旦transaction成功進入?yún)^(qū)塊,賬戶余額會根據(jù)以太坊虛擬機的gas規(guī)則被扣減。
第七步:與合約交互
與合約交互典型做法是使用eth.contract()功能的抽象層,它會返回java對象。描述合約可用功能的標準方法是ABI定義。
當sendTransaction被調(diào)用時,功能調(diào)用通過發(fā)送transaction來執(zhí)行。需要花費以太幣發(fā)送,記錄會永久記錄在區(qū)塊鏈上。這種方式返回的是transaction散列。
當call被調(diào)用時,功能在以太坊虛擬機本地執(zhí)行。用這種方式進行的調(diào)用不會記錄在區(qū)塊鏈上,因此不會改變合約內(nèi)部狀態(tài)。這種調(diào)用方式被稱為恒定功能調(diào)用,不花費以太幣。
最后,有興趣的朋友,也可以嘗試testrpc和truffle,更加方便。
聲明:文中關(guān)于“Ethereum Homestead 0.1 documentation”來自ethereum社區(qū)。如想了解更多,可通過ethereum社區(qū)官網(wǎng)進一步學習。
?Q&A
Q1:一次交易都要在以太坊的所有節(jié)點的EVM上執(zhí)行一遍嗎?
A1:是的。區(qū)塊鏈其實是比較昂貴的,它的目的不是為了提升效率。在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:哪些公司用以太坊做開發(fā)基礎(chǔ)?
A2:國內(nèi)的金丘股份,萬向區(qū)塊鏈實驗室,眾安保險,螞蟻金服。
Q3:智能合約的代碼量最大是1M嗎?也就是一個區(qū)塊的大小?
A3:1M是比特幣的區(qū)塊限制。
Q4:以太坊同步一次要多久?
A4:比特幣區(qū)塊鏈的大小約為84.9GB,現(xiàn)在以太坊的區(qū)塊鏈還比較小,第一次同步的時候,持續(xù)的十個小時左右,于網(wǎng)絡(luò)速率有關(guān)。
Q5:如果由于網(wǎng)絡(luò)中斷,導致出現(xiàn)兩條鏈,當網(wǎng)絡(luò)恢復后,如何合并這兩條鏈?
A5:不會合并的。最終還是拼的算力。
(接上一問)
Q6:這樣不是會導致很多分叉嗎?
A6:短時間是可能存在分叉的,但最終不會有分叉存在,例如比特幣”為了防止該區(qū)塊因為子鏈太短而被其它節(jié)點拋棄,那么還得等產(chǎn)生6個新的后續(xù)區(qū)塊,才能最終確認該transaction已經(jīng)被可靠地寫入?yún)^(qū)塊鏈中。即,確保可靠寫入,需要約60分鐘。 ”版本升級時,是有可能存在分叉問題的,因為有些礦工不愿意升級。
Q7:如果智能合約太大,無法在一個區(qū)塊中寫入,以太坊如何操作?
A7:因為合約之間可以通過消息調(diào)用,所以可以把代碼拆開,分別deploy。當然前提是真得有這么大的合約。
責任編輯:王培