《以太坊白皮書》原文鏈接:https://github.com/ethereum/wiki/wiki/White-Paper
Ethereum
Ethereum: a blockchain with a built-in Turing-complete programming language, allowing anyone to write smart contracts and decentralized applications where they can create their own arbitrary rules for ownership, transaction formats and state transition functions.
以太坊: 一個內(nèi)置了圖靈完備的程序語言的區(qū)塊鏈凉翻。任何人可以編寫智能合約莲镣;或者 “可以創(chuàng)造任意屬于自己的規(guī)則” 的去中心化應(yīng)用摆碉;以及交易格式和狀態(tài)轉(zhuǎn)化函數(shù)雳旅。
#4 Ethereum State Transition Function
以太坊中的狀態(tài)轉(zhuǎn)化函數(shù) APPLY(S, TX) -> S'
可以被定義為:
- 檢查交易格式是否正確(例如是否有正確的金額)蕉汪,數(shù)字簽名是否有效舷胜,以及隨機數(shù)是否匹配發(fā)送者的賬戶中的隨機數(shù)涕蚤。如果上述的條件不滿足地来,則返回錯誤卵酪。
- 計算交易的費用是否等于
STARTGAS * GASPRICE
幌蚊,并通過數(shù)字簽名確認(rèn)發(fā)送者的地址谤碳。在發(fā)送者的賬戶余額中減去交易的費用并增加發(fā)送者賬戶的隨機數(shù)。如果賬戶余額不足溢豆,則返回錯誤蜒简。 - 初始化
GAS = STARTGAS
,然后根據(jù)交易中每個字節(jié)所需要的 gas 去掉一部分 gas漩仙。 - 把交易的數(shù)額從發(fā)送者賬戶轉(zhuǎn)移到接受者賬戶搓茬。如果接受者賬戶不存在,就創(chuàng)建一個新的賬戶队他。如果接受者賬戶是一個合約卷仑,那么執(zhí)行合約中的代碼直到完成執(zhí)行或者消耗完所有的 gas。
- 如果因為發(fā)送者的余額不足導(dǎo)致數(shù)額轉(zhuǎn)移失敗麸折,或者合約代碼執(zhí)行完成前消耗完所有 gas锡凝,那么把狀態(tài)回退到交易之前,但交易的手續(xù)費并不會退回垢啼,而且會加到礦工的賬戶中私爷。
- 如果交易成功,退換剩余的 gas 對應(yīng)的費用給發(fā)送者膊夹,然后把消耗掉的 gas 對應(yīng)的費用支付給礦工衬浑。
舉個例子,假設(shè)合約代碼為:
if !self.storage[calldataload(0)]:
self.storage[calldataload(0)] = calldataload(32)
Note
通常來說合約代碼是低等級的 EVM 代碼放刨。上面使用的是一種高等級語言
Serpent
工秩。因為這樣更加清晰,而且也可以運行為 EVM 代碼进统。
假設(shè)合約在空的存儲情況下運行助币,且發(fā)送了一個金額為 10,gas 為 2000螟碎,每個以太的 gas 價格為 0.001眉菱,以及 64 字節(jié)數(shù)據(jù)(0-31 字節(jié)表示數(shù)字 2
,32-63 字節(jié)表示字符串 CHARLIE
)的交易掉分。在這個情景下狀態(tài)轉(zhuǎn)化函數(shù)的過程為:
- 檢查交易是否合法以及交易格式是否正確
- 檢查交易的發(fā)送至是否有
2000 * 0.001 = 2
的以太余額俭缓。如果有,那么從發(fā)送者的賬戶中減去 2 個以太 - 初始化 gas 值為2000酥郭;假設(shè)交易的長度為 170 字節(jié)华坦,且每個字節(jié)的手續(xù)費為 5。gas 值減去 850 剩下 1150
- 從發(fā)送者的賬戶余額中減去 10 以太不从,并在接收者賬戶中增加 10 以太
- 運行這段代碼(這個例子中代碼的結(jié)果很簡單:檢查存儲中索引為
2
的值惜姐,如果這個索引下的存儲中沒有值,那么把它賦值為字符串CHARLIE
)椿息。假如這段代碼耗費了 187 gas歹袁,那么 gas 值剩余 `1150 - 187 = 963 - 返還
963 * 0.001 = 0.963
以太到發(fā)送者的賬戶中坷衍,并返回結(jié)果的狀態(tài)。
如果交易的接收端沒有合約条舔,那么整個交易的手續(xù)費用會變得很簡單:用 GASPRICE
乘上整個交易的字節(jié)長度就能獲得最后的交易手續(xù)費用惫叛。而且交易中一并發(fā)送的數(shù)據(jù)會變得無關(guān)緊要。
#5 Blockchain & Mining
以太坊中的區(qū)塊鏈和比特幣的區(qū)塊鏈大致相同逞刷,但也有不同之處:以太坊的區(qū)塊鏈架構(gòu)和比特幣的不同,交易的列表和最近的狀態(tài)會在以太坊的區(qū)塊鏈中保存一份拷貝妻熊。除此之外夸浅,以太坊中的區(qū)塊的數(shù)量和挖礦難度都會保存在區(qū)塊鏈中。
以太坊中基本的區(qū)塊驗證算法如下:
- 檢查引用的上一個區(qū)塊是否存在且有效
- 檢查當(dāng)前區(qū)塊的時間戳是否大于上一區(qū)塊且差值小于15分鐘
- 檢查區(qū)塊序號扔役、難度帆喇、交易根、叔根和 gas 限額 (一些低等級以太坊特有的) 是否有效
- 檢查 POW 是否有效
- 令
S[0]
為上一區(qū)塊的最終狀態(tài) - 令
TX
為區(qū)塊包含的 n 條交易的列表亿胸。對于0...n-1
中所有的i
坯钦,讓S[i+1] = APPLY(S[i], TX[i])
。如果任一應(yīng)用返回錯誤侈玄,或者 gas 的消耗超出額度婉刀,直接返回錯誤。 - 令
S_FINAL
為S[n]
序仙,然后把獎勵給予礦工突颊。 - 檢查
S_FINAL
在 Merkle Tree 中的根節(jié)點是否和當(dāng)前區(qū)塊鏈中最后一個區(qū)塊的狀態(tài)在 Merkle Tree 中的根節(jié)點相同。如果相同潘悼,那么這個區(qū)塊有效律秃。
這樣的算法似乎看上去效率很低,因為每個區(qū)塊都需要儲存所有狀態(tài)的信息治唤。但其實在以太坊中棒动,其效率與比特幣系統(tǒng)可以相提并論,因為所有狀態(tài)都是以樹結(jié)構(gòu)存儲的宾添,每個區(qū)塊的生成只需要對整個樹的某一小部分做修改船惨。通常,對兩個相連的區(qū)塊缕陕,其樹結(jié)構(gòu)大致相同掷漱。因此,數(shù)據(jù)可以只存儲一次榄檬,通過指針(子樹的哈希值)達(dá)到多次引用卜范。另外,由于最新的所有狀態(tài)信息存儲在區(qū)塊鏈中最后一個區(qū)塊中鹿榜,那么就沒有必要再保存整個區(qū)塊鏈的歷史記錄了 —— 這種策略如果應(yīng)用在比特幣系統(tǒng)中海雪,大概可以節(jié)省 5 - 20 倍的存儲空間锦爵。
#6 Applications
通常來講,以太坊為基礎(chǔ)的應(yīng)用有三種類型:
- 金融應(yīng)用奥裸。提供給用戶更為強大的渠道去管理用戶的資金险掀,且用戶可以通過這些資金進(jìn)入一些合約。包含子貨幣湾宙,金融衍生品樟氢,對沖合約,儲蓄錢包侠鳄,遺囑埠啃,甚至一些種類的全面的雇傭合約。
- 半金融應(yīng)用伟恶。這些應(yīng)用中碴开,用戶的資金需要參與,但資金相關(guān)的只是一小部分博秫,更多的是與錢無關(guān)的部分潦牛。例如一個強制自我獎勵機制的解決計算性問題的應(yīng)用(并不能懂這是什么應(yīng)用。挡育。)巴碗。
- 非金融應(yīng)用。例如一些去中心自治系統(tǒng)或者線上投票即寒。
白皮書中還列舉了幾種比較有特點的應(yīng)用:令牌系統(tǒng)良价、金融衍生品和穩(wěn)定價值貨幣、身份和信譽系統(tǒng)蒿叠、去中心存儲明垢、去中心自治組織等。其中比較有意思的是去中心自治組織市咽,下面會詳細(xì)闡述痊银。
DAO
去中心化自治組織(DAO, decentralized autonomous organization)的概念,最早在 Oei Brafman 2007年出版的《海星和蜘蛛》一書中提出:
蜘蛛是中心化(細(xì)胞)組織的例子施绎,如果把它的頭切掉后(整個組織)就無法生存了溯革。海星則是由彼此對等(無中心)的一堆細(xì)胞組成,海星撕下的每只觸手都可成長為完整的海星谷醉。
文中的蜘蛛和海星致稀,分別映射了中心化組織 (現(xiàn)實中的絕大部分組織) 和去中心化組織【隳幔基于區(qū)塊鏈的技術(shù)抖单,這種 “海星“ 得以存在:運行在以太坊系統(tǒng)上的一系列可以實現(xiàn)組織職能的智能合約集合。
對于現(xiàn)在的傳統(tǒng)公司或組織來說,通常其等級結(jié)構(gòu)都是自上而下的矛绘。例如股份制公司耍休,董事會和 CEO 負(fù)責(zé)公司整體的的運營和管理。普通員工的決策并不能影響到整家公司货矮。
去中心化自治組織羊精,或者去中心化自治公司 (DAC, decentralized autonomous company) 與傳統(tǒng)組織或公司相比,最大的不同是:這種公司或組織由所有成員共同擁有和經(jīng)營囚玫,而不是單一個人擁有并經(jīng)營喧锦。比特幣就是一個很好的例子,整個比特幣由所有參與的節(jié)點共同維護(hù)抓督,而沒有一個中心化的 “中央管理者”燃少。網(wǎng)絡(luò)中的任一節(jié)點都是對等的,沒有權(quán)力上的優(yōu)劣本昏。
在這種 DAO 或者 DACs 中,其 “規(guī)則” 通常以代碼的形式寫在智能合約當(dāng)中枪汪。這些 “規(guī)則” 決定了這家公司或組織可以干什么:它是賣東西的涌穆,還是提供服務(wù)的等等。而且雀久,這個 “規(guī)則” 是可以被修改的:只要超過一定數(shù)量的人參與投票并同意宿稀,那么創(chuàng)始人就可以修改原先寫好的智能合約(可以理解成人人都是董事會成員,人人都可以參與決定公司的未來赖捌,同時人人都需要承擔(dān)決策的風(fēng)險)祝沸。
最重要的是,以太坊系統(tǒng)越庇,或者區(qū)塊鏈罩锐,并不限定這個組織或公司的功能和領(lǐng)域,它只提供給組織或公司一個經(jīng)濟(jì)激勵平臺作為基礎(chǔ)卤唉。也就是說涩惑,就像股份制公司一樣,區(qū)塊鏈只是像股市一樣提供給其一個獲得激勵桑驱、回報的平臺竭恬,而公司的產(chǎn)業(yè),取決于參與的股東(DAO/DACs 中的每個節(jié)點)熬的。
Tom Ding 在《2020: A Call for DApps and DAOs》中解釋痊硕,這種形式的公司非常適合完成一些小而簡單,重復(fù)性的工作押框。
每個工作在網(wǎng)絡(luò)中能夠輕易地被分割岔绸,從而工作可被程序或者人為驗證,這個過程非常難被操縱。
因為這種形式的公司其職能由其智能合約的內(nèi)容決定亭螟,而智能合約的執(zhí)行則可以完全自動化挡鞍,“人” 在其中所扮演的角色只是負(fù)責(zé)一些機器力所不能及的事:例如修正整個公司的目標(biāo)或者部分職能。就像一家完全自動化的無人商店预烙,顧客想購買某樣產(chǎn)品只需要在以太坊中發(fā)起相應(yīng)的交易墨微,其余的工作都交給了智能合約去執(zhí)行,“人” 所需要做的只是修改商品的內(nèi)容等等(其實與一些電商平臺如淘寶扁掸、京東等很類似)翘县。
閱讀 Github 上 《Ethereum - White Paper》 的一些筆記