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