[TOC]
以太坊技術(shù)要點
密鑰、地址、錢包賬戶
關(guān)系可以參考錢包技術(shù)的ETH地址生成
加密算法:Keccak256、ECDSA、RIPEMD-160、PBKDF2
- PBKDF2(Password-Based Key Derivation Function,基于密碼的密鑰推導(dǎo)函數(shù)2)是一個用來導(dǎo)出密鑰的函數(shù),常用于生成加密的密碼。參考:PBKDF2
- 以太坊的賬戶地址是以Keccak-256散列法運算一個公鑰而得出的。(源于SHA3算法)
- RIPEMD-160是基于Merkle-Damg?rd構(gòu)造的加密散列函數(shù)。它用于比特幣標(biāo)準(zhǔn)。它是RIPEMD算法的增強版本,它產(chǎn)生128位散列摘要,而RIPEMD-160算法產(chǎn)生160位輸出。壓縮功能由80個階段組成,每個階段由5個塊組成,每個塊運行16次。該模式運行兩次,結(jié)果在底部使用模32加法組合。參考:RIPEMD-160
- ECDSA(橢圓曲線數(shù)字簽名算法)。參考:Elliptic Curve Digital Signature Algorithm
- HMAC(有時擴展為密鑰散列消息認(rèn)證碼或基于散列的消息認(rèn)證碼)是涉及加密散列函數(shù)和秘密加密密鑰的特定類型的消息認(rèn)證碼(MAC)。 參考:HMAC
交易
參考:transactions
交易結(jié)構(gòu)
交易是包含以下數(shù)據(jù)的序列化二進制消息:
- nonce:由發(fā)起人EOA發(fā)出的序列號,用于防止重播消息。
- gas price:發(fā)起人愿意支付的gas價格(wei)。
- start gas:發(fā)起人愿意支付的最大gas量。
- to:目的地以太坊地址。
- value:要發(fā)送到目的地的以太數(shù)量。
- data:可變長度二進制數(shù)據(jù)負(fù)載。
- v,r,s:發(fā)起人EOA的ECDSA簽名的三個組成部分。
交易簽名
以太坊中使用的數(shù)字簽名算法是橢圓曲線數(shù)字簽名算法,ECDSA。ECDSA是用于基于橢圓曲線私鑰/公鑰對的數(shù)字簽名的算法。
為了產(chǎn)生有效的交易,發(fā)起者必須使用橢圓曲線數(shù)字簽名算法對消息應(yīng)用數(shù)字簽名。實際上是指“簽署RLP序列化交易數(shù)據(jù)的Keccak256哈希”。
步驟:
- 創(chuàng)建一個包含九個字段的交易數(shù)據(jù)結(jié)構(gòu):nonce,gasPrice,startGas,to,value,data,v,r,s
- 生成RLP編碼的交易序列化消息
- 計算此序列化消息的Keccak256哈希值
- 計算ECDSA簽名,使用發(fā)件人EOA的私鑰對哈希進行簽名
- 在交易中插入ECDSA簽名的計算r和s值
數(shù)據(jù)結(jié)構(gòu):Merkle Patricia Tree(MPT)
Merkle Patricia tries提供一個密碼認(rèn)證的數(shù)據(jù)結(jié)構(gòu),可用于存儲所有(key,value)綁定。
在以太坊上,從區(qū)塊頭開始有3個Root來自3個這樣的trees:
- stateRoot(State Tree)
- transactionsRoot(Transactions Tree)
- receiptsRoot(Receipts Tree)
而Storage Tree,是所有合約數(shù)據(jù)所在的地方。每個帳戶都有一個單獨的存儲索引。
序列化:RLP
參考:RLP
遞歸長度前綴,區(qū)塊、交易、賬戶狀態(tài)等數(shù)據(jù)的序列化格式;
EVM
以太坊協(xié)議和操作的核心是以太坊虛擬機,簡稱EVM。它負(fù)責(zé)處理智能合約的部署和執(zhí)行,在較高的層次上,在以太坊區(qū)塊鏈上運行的EVM可以被認(rèn)為是包含數(shù)百萬個可執(zhí)行對象的全局分散計算機,每個可執(zhí)行對象都有自己的永久數(shù)據(jù)存儲。
EVM具有基于堆棧的體系結(jié)構(gòu),將所有內(nèi)存中的值存儲在堆棧中。具有多個可尋址的數(shù)據(jù)組件:
- 一個不可變的程序代碼ROM,加載了要執(zhí)行的智能合約的字節(jié)碼
- 臨時性存儲器,每個位置都明確初始化為零
- 作為以太坊狀態(tài)的一部分的永久存儲器,也是零初始化的
EVM指令集提供了以下操作,包括:
- 算術(shù)和按位邏輯運算
- 執(zhí)行上下文查詢
- 堆棧,內(nèi)存和存儲訪問
- 控制流程操作
- 記錄,調(diào)用和其他操作
共識算法
參考:Consensus
POW:Ethash
Ethash是以太坊PoW算法。它使用了Dagger-Hashimoto算法的演化,該算法是Vitalik Buterin的Dagger算法和Thaddeus Dryja的Hashimoto算法的組合。Ethash依賴于大數(shù)據(jù)集的生成和分析,稱為有向無環(huán)圖(或更簡單地說,“DAG”)。
DAG的目的是使Ethash PoW算法依賴于維護大型,頻繁訪問的數(shù)據(jù)結(jié)構(gòu)。這反過來旨在使Ethash“ASIC抗性”,這意味著制造比快速圖形處理單元(GPU)快幾個數(shù)量級的專用集成電路(ASIC)采礦設(shè)備更加困難。以太坊的創(chuàng)始人希望避免在PoW挖礦中集中化,那里有專門的硅制造工廠和大預(yù)算的人可以主導(dǎo)采礦基礎(chǔ)設(shè)施并破壞共識算法的安全性。
POS:Casper
Casper是以太坊PoS共識算法的擬議名稱。它仍處于積極的研究和開發(fā)階段。正在開發(fā)的有兩個版本:
- Casper FFG: "The Friendly Finality Gadget"
- Casper CBC: "The Friendly GHOST/Correct-by-Construction"
測試網(wǎng)絡(luò):Ropsten、Rinkeby、Kovan、Ganache
Swarm
參考:swarm-guide
一個分布式存儲平臺和內(nèi)容分發(fā)服務(wù),是以太坊web3堆棧的本機基礎(chǔ)層服務(wù)。
主要目標(biāo)是提供一個足夠分散和冗余的以太坊公共數(shù)據(jù)庫,特別是存儲和分發(fā)dapp代碼和數(shù)據(jù)以及區(qū)塊鏈數(shù)據(jù)。
bzz協(xié)議
swap協(xié)議
Whisper
Dapp之間的通信協(xié)議;
用例:
- 需要向?qū)Ψ桨l(fā)布少量信息的DApps,并且需要大量的時間。例如,貨幣兌換商DApp可以使用它來記錄在交易所以特定匯率出售某種貨幣的要約。在這種情況下,它可能會持續(xù)幾十分鐘到幾天。這個提議不會有約束力,只是暗示有可能開始一筆潛在的交易。
- DApp需要互相發(fā)信號,以便最終協(xié)作進行交易。例如,貨幣兌換商DApp可以在交易所創(chuàng)建一個(或兩個,取決于交易所結(jié)構(gòu)如何)交易之前使用它來協(xié)調(diào)報價。
- 需要在對方之間提供非實時提示或通用通信的DApps。例如一個小型聊天室應(yīng)用程序。
- 那些需要提供黑暗(對完美的網(wǎng)絡(luò)流量分析合理否定)的DApp通信給兩個對彼此一無所知但只是散列的記者。這可能是一個告密者與一個已知的記者交換機溝通一些少量的可驗證材料并在他們自己之間安排一些其他協(xié)議(可能是Swarm)來處理批量傳輸?shù)腄App。
Devp2p
參考:devp2p
p2p網(wǎng)絡(luò)框架;(基于DHT,Kademlia算法實現(xiàn))
RLPx
參考:The RLPx Transport Protocol
一種加密的p2p網(wǎng)絡(luò)和協(xié)議套件,為應(yīng)用程序通過p2p網(wǎng)絡(luò)提供通用傳輸和接口。
節(jié)點發(fā)現(xiàn)協(xié)議
該規(guī)范定義了節(jié)點發(fā)現(xiàn)協(xié)議版本4,這是一種類似Kademlia的DHT,用于存儲有關(guān)以太坊節(jié)點的信息。選擇Kademlia結(jié)構(gòu)是因為它產(chǎn)生了低直徑的拓?fù)浣Y(jié)構(gòu)。
以太坊正在進行的版本:discv5
Bencode編碼
參考:Bencode編碼
Plasma
參考:plasma
是以太坊的一種二層協(xié)議擴容方案。解決合約狀態(tài)變化的擴容問題。
相當(dāng)于權(quán)利下放。主鏈看做最高法,而所有下級法院從中獲得權(quán)利。創(chuàng)建一個足夠平衡的系統(tǒng)來最大化數(shù)據(jù)可用性、安全,同時減少成本。
Plasma由三個主要部分組成。
- Plasma chain:實際交易發(fā)生的簡單權(quán)威證明鏈。
- Plasma contract:在根鏈上部署的智能合約,用于處理子鏈(Plasma鏈)的存款和取款。
- Ethereum blockchain:只記錄等離子鏈的區(qū)塊頭的根鏈。
雷電網(wǎng)絡(luò)
參考:閃電網(wǎng)絡(luò)和雷電網(wǎng)絡(luò)詳解
類似于比特幣的閃電網(wǎng)絡(luò),提出一個狀態(tài)通道的擴容解決方案。
通過智能合約,雙方約定轉(zhuǎn)賬方先凍結(jié)一筆錢,并提供一個哈希值,如果在一定時間內(nèi)有人能提出一個字符串,使得它的哈希值跟已知值匹配(實際上意味著轉(zhuǎn)賬方授權(quán)了接收方來提現(xiàn)),則這筆錢轉(zhuǎn)給接收方。
Cosmos & Tendermint
參考:深度解析Tendermint,快速融入Cosmos生態(tài)、跨越當(dāng)前鏈的邊界,Cosmos技術(shù)深扒
Oracle
可以為以太坊智能合約提供外部數(shù)據(jù)源的系統(tǒng)。
解決問題:
- EVM和智能合約沒有內(nèi)在的隨機性來源;
- 外部數(shù)據(jù)只能作為交易的數(shù)據(jù)有效載荷引入。
關(guān)鍵功能:
- 從離線源收集數(shù)據(jù)。
- 使用簽名消息在鏈上傳輸數(shù)據(jù)。
- 將數(shù)據(jù)放入智能合約的存儲空間,使數(shù)據(jù)可用。
一旦數(shù)據(jù)在智能合約的存儲中可用,其他智能合約就可以通過調(diào)用oracle智能合約的“檢索”功能的消息調(diào)用來訪問它; 它也可以通過“查看”oracle的存儲直接由以太坊節(jié)點或支持網(wǎng)絡(luò)的客戶端訪問。
Smart Contract Dev
Solidity
參考: solidity
Solidity是一種面向合約的高級語言,其語法類似于JavaScript。
Solidity是靜態(tài)類型的,支持繼承,庫和復(fù)雜的用戶定義類型以及其他功能。
Truffle
參考:truffle docs
以太坊智能合約開發(fā)框架。
- 內(nèi)置智能合約編譯、鏈接、部署和二進制管理。
- 快速開發(fā)的智能合約測試。
- 可編寫腳本的可擴展部署和遷移框架。
- 用于部署到任意數(shù)量的公共和專用網(wǎng)絡(luò)的網(wǎng)絡(luò)管理。
- 使用ERC190標(biāo)準(zhǔn),使用EthPM和NPM進行包裝管理。
- 交互式控制臺,用于直接調(diào)用合約。
- 可配置的build渠道,支持持續(xù)集成。
- 在Truffle環(huán)境中執(zhí)行腳本的外部腳本運行器。
Web3j
參考:Web3j
web3.js是一個庫集合,允許使用HTTP或RPC連接與本地或遠(yuǎn)程以太坊節(jié)點進行交互。