
《以太坊白皮書(shū)》原文鏈接: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.
以太坊: 一個(gè)內(nèi)置了圖靈完備的程序語(yǔ)言的區(qū)塊鏈。任何人可以編寫(xiě)智能合約;或者 “可以創(chuàng)造任意屬于自己的規(guī)則” 的去中心化應(yīng)用;以及交易格式和狀態(tài)轉(zhuǎn)化函數(shù)。
#1 Smart Contract
以太坊中最重要的概念: 智能合約。相對(duì)于比特幣來(lái)說(shuō),智能合約可以說(shuō)是比特幣中 ”腳本“ 的升級(jí)加強(qiáng)版:智能合約可以支持更強(qiáng)大的腳本語(yǔ)言(圖靈完備的腳本語(yǔ)言),并允許開(kāi)發(fā)者開(kāi)發(fā)任意應(yīng)用實(shí)現(xiàn)智能合約(可以將以太坊想象為一個(gè)應(yīng)用商店,用戶(hù)可以從上面買(mǎi)到任一應(yīng)用)。
以太坊 = 比特幣 + 智能合約

智能合約,從概念上來(lái)說(shuō),是運(yùn)行在可復(fù)制、共享的賬本上的一段計(jì)算機(jī)程序。它由用戶(hù)發(fā)布,且發(fā)布之后無(wú)法修改。每個(gè)合約都相當(dāng)于一段代碼,且都有一個(gè)賬戶(hù)地址。每當(dāng)這個(gè)地址發(fā)生交易的時(shí)候,這段代碼就會(huì)被執(zhí)行。
- 每個(gè)合約只能以區(qū)塊鏈作為輸入和輸出。
- 任一合約可以調(diào)用其他合約中的函數(shù)。
- 執(zhí)行合約的過(guò)程中可以創(chuàng)建新的交易。
#2 Accounts
在以太坊中,狀態(tài)由一個(gè)個(gè)稱(chēng)之為 “賬戶(hù)” 的對(duì)象組成。每一個(gè)賬戶(hù)有一個(gè) 20 byte 的地址和<u>賬戶(hù)之間價(jià)值和信息的直接轉(zhuǎn)換而來(lái)的狀態(tài)轉(zhuǎn)變。</u>(這段話(huà)有點(diǎn)難理解,簡(jiǎn)單來(lái)說(shuō)就是賬戶(hù)的交易過(guò)程中產(chǎn)生的對(duì)象實(shí)體。)
以太坊中每個(gè)賬戶(hù)包含 4 個(gè)部分:
- 隨機(jī)數(shù),一個(gè)用來(lái)確保每筆交易只能被執(zhí)行一次的計(jì)數(shù)器。
- 當(dāng)前的以太余額 (以太坊中的貨幣單位為 “以太” )。
- 賬戶(hù)的合約代碼,如果有的話(huà)。
- 賬戶(hù)的存儲(chǔ)(默認(rèn)為空)。
賬戶(hù)有兩種類(lèi)型:
- 外部所有賬戶(hù),由私鑰控制。這種賬戶(hù)沒(méi)有包含任何代碼,而且任何人都可以通過(guò)創(chuàng)建和簽名一條交易來(lái)通過(guò)這種賬戶(hù)發(fā)送消息。
- 合約賬戶(hù),由它們的合約代碼控制。在合約賬戶(hù)中,每當(dāng)此賬戶(hù)接收到一條消息的時(shí)候,它的合約代碼便會(huì)被執(zhí)行。這使得合約賬戶(hù)可以讀寫(xiě)內(nèi)部存儲(chǔ),并發(fā)送其他消息或者在執(zhí)行過(guò)程中創(chuàng)建其他交易。
Note
“合約” 在以太坊中并不應(yīng)該被視為一種應(yīng)該 “用它來(lái)填滿(mǎn)” 或者 “服從于它的規(guī)則” 的東西。它們更像是一種在以太坊執(zhí)行環(huán)境內(nèi)部的 “自主媒介”。它們總是在接收到消息或者交易的時(shí)候執(zhí)行一段代碼片段,并直接控制屬于它們的以太余額和鍵值存儲(chǔ),以此來(lái)追蹤不斷變化的狀態(tài)。
#3 Messages and Transactions
Transactions
以太坊中的 “交易” :表示已經(jīng)簽名過(guò)的,儲(chǔ)存著一個(gè)發(fā)送到外部所有賬戶(hù)的 “消息” 的數(shù)據(jù)的集合。包含:
- 消息的接收者
- 標(biāo)識(shí)發(fā)送者的簽名
- 發(fā)送者轉(zhuǎn)移給接受者的以太總額
- 一個(gè)可選的數(shù)據(jù)域
- 一個(gè)
STARTAGS值,用來(lái)表示交易執(zhí)行過(guò)程中允許的最大計(jì)算步驟 - 一個(gè)
GASPRICE值,用來(lái)表示每一個(gè)計(jì)算步驟發(fā)送者需要支付的費(fèi)用
Note
STARTGAS和GASPRICE兩個(gè)部分對(duì)于以太坊的 anti-denial-of-service model (反阻斷服務(wù)模型) 至關(guān)重要。為防止意外出現(xiàn)或者惡意執(zhí)行的代碼無(wú)限循環(huán),以及一些代碼造成的計(jì)算浪費(fèi)。
計(jì)算的基本單位為 "gas"。通常,一個(gè)計(jì)算步驟會(huì)消耗一個(gè) gas,不過(guò)一些復(fù)雜的(包括一些需要昂貴的計(jì)算成本的,或者需要儲(chǔ)存更多數(shù)據(jù)到狀態(tài)中的)計(jì)算會(huì)消耗更多的 gas。交易數(shù)據(jù)中每一個(gè)字節(jié)都需要 5 個(gè) gas 的花費(fèi)。
Messages
所有合約都向其他合約可以發(fā)送 ”消息“ 。這里的消息是一些虛擬對(duì)象,它們只在以太坊的執(zhí)行環(huán)境中存在,且不會(huì)被序列化。一個(gè)消息包含:
- 消息的發(fā)送者 (默認(rèn)包含)
- 消息的接收者
- 關(guān)聯(lián)的交易的以太金額
- 一個(gè)可選的數(shù)據(jù)域
- 一個(gè)
STARTGAS值
需要著重留意的是,一個(gè)消息就像一筆交易一樣,會(huì)使得接收者的賬戶(hù)執(zhí)行它的關(guān)聯(lián)代碼。不同點(diǎn)在于,消息是由合約產(chǎn)生的(當(dāng)合約代碼執(zhí)行到 CALL 操作碼時(shí)),且它不是一個(gè)外部參與者。因此,合約可以和其他合約產(chǎn)生關(guān)聯(lián),就像就像外部參與者一樣。
Note
以太坊中消息機(jī)制的存在,使得合約與外部賬戶(hù)擁有同樣的 —— 發(fā)送消息和創(chuàng)建其他合約的權(quán)力。
閱讀 Github 上 《Ethereum - White Paper》 的一些筆記