以太坊簡介
IPFS
[ 簡介 ]
- 以太坊(Ethereum)在2015年夏,以PoW的共識機制問世,目標是要建立一台去中心化的「世界計算機」,讓在上面運行的應用程式從本質上就具有去中心化的性質,而這類型的應用程式被稱為Decentralized App (DApp)。
- 從傳統的三難問題角度來看,以太坊具有安全、去中心化、但沒有效率。
- 相對於UTXO架構,以太坊採用了相對陽間的Account-Based Model。與人類的直覺比較相符:當你點進某一個帳戶地址查詢時,能看到帳戶餘額以及帳戶地址的每一筆交易。
- 這架構的優勢除了更加直覺之外,也更適用於簡單的交易:只要對兩個帳戶的餘額做增減,不用像UTXO一樣還要去湊到剛好金額的支票。另外也原生支持智能合約的部署,因為合約很常需要持續追蹤一個帳號的餘額。
- 相對的,Account-Based Model的缺點是無法進行平行化處理,所以性能會比較差,需要有擴容方案來提昇TPS。有關擴容方案,我們下一篇會專門來講。
- 2016年的時候,有一個叫做 The DAO的專案募到了大約1200w顆的ETH。但合約中存在漏洞,被駭走了360w顆 ETH,因為佔總流通的比例過大,在以太坊基金會的主導下,做了一次硬分叉,去回溯這次的被駭事件。有回溯的那個分叉就是現在大家所熟知的Ethereum。而初始那條不改動、被駭過的版本,也是有人支持的,也就是現在的「以太坊經典 Ethereum Classical (ETC)」。
- Wei是ETH最小的單位,等於10 E-18 ETH;1 GWei = 10 E-9 ETH是個比較常用的單位。
- Etherscan是以太坊的區塊瀏覽器,任何鏈上發生的交易跟資料都可以在那邊查的到。
[ 以太坊的交易細節 ]
- 一筆ETH的交易流程,大致與之前提到的Bitcoin差不多:想發送一筆交易時,我會先用私鑰去把交易請求上一個Signature,確保交易請求是我本人發出。在確認我帳戶有足夠的餘額後,就會把這筆交易請求丟進一個Tx Pool(交易池)中,礦工們會優先打包Gas Price高的交易,最後再把打包好的交易放到鏈上。
- Tx Fee (交易手續費) = 單位Gas的價格 x 使用了多少單位的Gas。作為一個交易發起方,你可以自己設定單位Gas的價格 (Gas Price),用來賄絡礦工優先執行你的交易。至於每個動作需要消耗多少單位的Gas是有約定俗成的,而不是由我們決定的,越複雜的行為需要花費越多的Gas。
- 至於Gas Limit,它的作用是去限制整個動作 Tx Fee的總上限,避免合約有漏洞導致花了不合理的Gas。建議不用設得太死,反正與最後沒用到的也會退回給你,會依實際使用為主。這邊的重點是,礦工是看的Gas Price來決定優先順序,而不是總Tx Fee的高低。
- 其實設定Gas Limit有更深層的原因,這邊不懂能先跳過不影響理解:為了讓EVM是一個類圖靈完備的狀態機,有Gas Limit的存在,可以使那些有問題的程式不會無限執行下去,也就能解決停機問題。
- 區塊大小限制上,Bitcoin是設定1MB的容量,而Ethereum用是15~30M單位的Gas定義,這數字隨不同的情況會浮動。
[ 智能合約 ]
- 與老大哥Bitcoin最大的差異,就是Ethereum原生支援了智能合約,也就是可以在區塊鏈上部署程式碼。
- 關於部署一個智能合約,具體來說,會先用Solidity這程式語言寫好程式,用Remix編譯成Bytecode,再把這個Bytecode放到Input Data這個區塊的欄位中,把傳送地址填上0x0,之後就跟一筆普通的交易一樣廣播出去就行。
- 部署一個合約後,合約會有一個屬於自己的永久地址,叫做Contract Account (CA);與之相對的,一般使用者的地址叫做Externally Owned Account (EOA)。以太坊上面就這兩種地址類型。
- 舉個例子,例如ETH原先的設計,是拿來作為使用以太坊網路,所要的支付Gas Fee用,而它其實並不是一個符合ERC-20的代幣,導致了一個很搞笑的情況:ETH無法在很多以太坊上的DApp中直接使用。解決辦法就是部署一個智能合約,你把1 ETH發送過去,合約回傳一個符合ERC-20的Wrapped ETH(WETH)給你,這種Swap的行為,背後就是透過智能合約來完成的。
- 或例如你想要讓BTC在以太坊上面流通,就能發送ERC-20版本的USDC,給到一個由某個DAO所部署的智能合約,它會把收到的USDC拿去買一顆BTC作為抵押品,並發出一顆符合ERC-20的Wrapped BTC給你,讓WBTC可以完美的錨定BTC(因為每顆WBTC背後就是一顆BTC),變相達到使BTC在Ethereum上流通的目的。
- 大部分的智能合約都會去兼容ERC-20,這背後的原因是要增進可組合性(Composability)。這邊有一個進階但有趣的細節是:所有ERC 20的代幣都是有一支專門的Smart Contract在管理的,也就是說,你帳戶所擁有的例如USDC,其實是在USDC的CA中,有個資料庫說你這個EOA有多少的USDC。一個EOA要發送ERC 20 token給其他EOA時,它是透過呼叫CA上的transfer功能來完成。唯一的例外是ETH的發送,是能直接從EOA送到其他EOA,所以ETH也被稱謂native token。
[ Nonce ]
- 這邊談的是Ethereum上面的交易時的Nonce。注意,它跟我們之前在《如何防止一個帳本被篡改》上面所說的那個挖礦的亂數Nonce沒有任何關係。
- 在以太坊黃皮書中的定義,它是一個從零開始的嚴格遞增的整數,用來記錄一個帳戶交易的順序。
- 當EOA向外發送一筆交易,或是CA每創建一個合約,就會把Nonce值加一。
- 一個帳戶中,發送的每一筆交易時,可以自己主動設定一個Nonce值,用來告訴礦工Tx的前後順序,Nonce值越小的會先被處理。
- 沒有Nonce的話,如果Tx Pool中有兩筆以上同帳戶的Pending Tx,會讓不同礦工可以有不同的打包順序,而這會出問題。
- 這機制能避免Replay Attacks(重送攻擊):別人可以直接複製你的Tx的資訊,就會再執行交易一次。如果附上Nonce的話,就只能被礦工打包一次,以此來規避這問題。重送攻擊就是以太坊版本的雙花攻擊。(礦工會檢查,例如已經有nonce = 3的交易,再看到一筆nonce = 3,會自動忽略丟棄。)
- 如果想要加速交易的話,就發送同Nonce同內容的交易請求,把Gas Price調高就行,因為Gas Price低的那個永遠不會被執行到。
- 想要取消交易也是同個道理,同Nonce,內容改成發送0 ETH之類的,再把Gas Price調高,取消的成本就是這個gas fee。
- Nonce是可以跳號設定的:當中間的交易被填滿的時候,這一筆原先跳號的會正常地繼續被執行。例如我的帳號目前Nonce是3,我先送了一筆Nonce為5的交易訊息,可以先送,但它會等到Nonce為4的交易完成之後,才接著被執行。
- 一個帳戶最多能在Tx Pool裡面中,放入64筆待交易的Pending Tx,而不能無限累積一堆在Tx Pool中。
上面的內容,希望能讓你嚐到一點以太坊的味道,但其實作爲一台世界電腦,以太坊有一個「狀態(State)」的觀念我們一直沒有提到,這一部分之後會來講。Be Happy & Stay Tuned,回頭見!
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!