21-ETH-智能合約

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

什麼是智能合約

智能合約是運行在區塊鏈上的一段代碼,代碼的邏輯定義了合約的內容。

智能合約的賬戶保存了合約當前的運行狀態:

  • balance:當前餘額
  • nonce:交易次數
  • code:合約代碼
  • storage:存儲,數據結構是一顆 MPT

Solidity 是智能合約最常用的語言,語法上與 JavaScript 很接近。

智能合約代碼結構

注意:

  • 有需要接受外部轉賬的函數,函數都需要交集爲 payable,否則會拋出異常。

外部賬戶如何調用智能合約?

創建一個交易,接收地址爲要調用的那個智能合約的地址,data 域填寫要調用的函數及其參數的編碼值,如下圖所示。

一個合約如何調用另一個合約中的函數?

1、直接調用的方式

注意:合約地址只能由外部地址發起交易,合約地址不能主動發起交易。所以,上圖最原始一定是有一個外部地址發起合約 B,合約 B 才能調用合約 A。

2、使用 address 類型的 call() 函數的方式

這兩種方式的區別:直接調用方式,被調用的合約出現異常,調用合約的一方也會異常,叫做異常回滾;使用 call 調用方式,被調用的合約出現異常只會返回 false,調用合約的一方繼續運行。

3、代理調用 delegatecal() 方式

fallback() 函數

智能合約的創建與運行

智能合約的代碼寫完後,要編譯成 bytecode。

創建智能合約:外部地址發起一個轉賬交易到 0x0 的地址。

  • 轉賬的金額爲 0,但是要支付 gas 費,
  • 合約的代碼放在 data 域裏。

智能合約運行在 EVM(Ethereum Virtual Machine)上。

以太坊是一個交易驅動的狀態機:調用智能合約的交易發佈到區塊鏈上後,每個礦工都會執行這個交易,從當前狀態確定性地轉移到下一個狀態

汽油費(gas fee)

錯誤處理

嵌套調用

Block Header 中的汽油費

  • GasUsed:區塊中所有交易所花費 gas fee 的總額。
  • GasLimit:表示這個區塊能消耗 gas fee 的上限,如比特幣有 1M 的區塊大小限制,同樣這個 gasLimit 可以限制區塊中對多能包含的交易數量。這個值可以讓礦工進行 1/1024 的幅度的上下微調,所以這個值會趨於所有礦工的平均意見。

收據樹-Receipt 數據結構

  • Status:用於判斷交易是否成功。

智能合約可以獲得的區塊信息

智能合約可以獲得的調用信息

地址類型

例子-簡單拍賣

上圖2,存在什麼問題?

如果黑客發起攻擊,拍賣結束,退款時,所有參與拍賣的人都會收不到錢,包括拍賣勝出者。看看下面第二個版本。

第二個版本-簡單拍賣

這樣可以了嗎?當有黑客如下圖那樣,會發起重入攻擊:

修改後:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章