什么是智能合約?
- 智能合約是運行在區塊鏈上的一段代碼,代碼的邏輯定義了合約的內容,
- 智能合約的賬戶保存了合約當前的運行狀態
balance:當前余額
nonce:交易次數
code:合約代碼
storage:存盤,資料結構是一顆MPT樹 - Solidity是智能合約最常用的語言,語法上與JavaScript很接近
- example

【payable】
以太坊規定如果合約賬戶要能接受外部轉賬,必須標注payable,
呼叫智能合約
如何呼叫智能合約
創建一個交易,接收地址為要呼叫的呢個智能合約的地址,data域填寫要呼叫的函式及其引數的編碼值,

一個合約呼叫另一個合約中的函式
- 直接呼叫

以太坊中規定一個交易只能由外部賬戶發起,合約賬戶不能主動發起, - 使用address型別的call()函式

- 代理呼叫delegatecall()


智能合約的創建和運行
智能合約的代碼寫完后,要編譯成bytecode
創建合約
- 外部賬戶發起一個轉賬交易到0x0的地址
- 轉賬的金額是0,但是要支付汽油費
- 合約代碼放在data宇里
合約運行
- 智能合約運行在EVM(Ethereum Virtual Machine)上
- 以太坊是一個交易驅動的狀態機,呼叫智能合約的交易發布到區塊鏈上后,每個礦工都會執行這個交易,從當前狀態確定性地轉移到下一個狀態,
汽油費
智能合約是個Tuning-complete Programming Model
(因此出現死回圈時沒辦法,Halting Problem)
因此為了防止出現出現死回圈,引入了汽油費機制,
- 執行合約中的指令要收取汽油費,由發起交易的人來支付,

AccountNonce:交易序號,防止replay attack
Price:單位汽油的價格
GasLimit:交易愿意支付的最大汽油量
(最大汽油費 = Price * GasLimit)
Recipient:收款人地址
Amount:轉賬金額
PayLoad:data域,用于存放資料 - EVM中不同的指令消耗的汽油費是不一樣的,簡單的指令很便宜,復雜或需要存盤狀態的指令就很貴,
錯誤處理
以太坊中的交易具有原子性,交易中的事物要么全部執行,要么全部不執行,發生錯誤之前消耗的汽油費不會退回,因為隨意的發起復雜的呼叫而不給夠多的汽油費會使礦工消耗巨大資源,
- 智能合約中不存在自定義的try-catch結構
- 一旦遇到例外,出特殊情況外,本次執行操作全部回滾
- 可以拋出錯誤的陳述句:
– assert(bool condition) 如果條件不滿足就拋出—用于內部錯誤
– request(bool condition) 如果條件不滿足就拋掉—用于輸入或外部組件引起的錯誤,

– revert() 終止運行并回滾狀態變動(無條件拋出例外)
嵌套呼叫
- 智能合約的執行具有原子性:執行程序中出現錯誤,會導致回滾
- 嵌套呼叫是指一個合約呼叫另一個合約中的函式
- 嵌套呼叫是否會觸發連鎖式的回滾?
有些呼叫方法會引起連鎖式的回滾,有些則不會, - 一個合約直接向一個合約賬戶里轉賬,沒有指明呼叫哪個函式,任然會引起嵌套呼叫,

GasLimit:對區塊消耗的資源進行限制(所有汽油費消耗的上限)
GasUsed:區塊中所消耗的所有汽油費加在一起,
先執行智能合約再挖礦,
Receipt資料結構
交易執行完成后形成的收據,




address.balance:address的余額
address.transfer(金錢):當前合約向address轉入多少金錢(會導致連鎖式回滾)
舉例

拍賣程序中不允許中途退出,可多次競拍(補差價即可),


使用上述代碼會產生回滾,



轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/261022.html
標籤:區塊鏈
