以太坊知识教程------智能合约(2)调用
1. 合約消息
合約之間通過調用或發送消息的方式進行交互 。當一個合約接收到一條消息時,它可以回復一些數據,這樣消息的原發送者就能立即使用 。采用這種方法,發送一條消息就像調用一次函數。
- 一個智能合約能夠給其他智能合約發送消息( Messages ) 。
- 消息是永遠不會序列化的虛擬對象 ,僅存于以太坊執行環境,可以認為就是函數調用。
- 合約可以通過消息調用的方式來調用其他合約 ,或者發送以太幣到非合約賬戶 。
- 消息除了是由合約產生而不是外部賬戶產生外 ,基本等同交易。消息觸發接收合約賬戶運行其代碼 。 因此,合約之間的關系與外部賬戶之間的關系基本類同。
- 當一個正在執行的合約執行call或者delegatecall操作命令時,就產生一條消息。
一個消息包含如下內容。
( 1 )消息的發送者(隱含) 。
( 2 )消息的接收者。
( 3) Value域 : 向智能合約地址轉賬的數量(單位為wei ) 。
( 4 )可選數據域 : 給智能合約的實際輸入參數。
( 5 ) Startgas值 : 消息觸發代碼執行所產生的最大燃料值。
( 6 ) 返回數據
“事實上每筆交易都可以被認為是一個頂層的消息調用,這個消息調用會依次產生更多 的消息調用 。”
2. 調用原理
2.1 觸發條件
1). 默認條件下 ,以太坊執行環境是無狀態的 。如沒有外部觸發 ,以太坊網絡的狀態不會發生變化 ,所有賬戶狀態都是一樣的 。
2). 任何用戶通過外部賬戶發送一個交易將觸發一個動作 ,從而使以太坊處于活動狀態。
3). 如果交易的目標是另外一個EOA外部用戶賬戶 ,交易除了 “虛擬幣 ” 互換外也不能做其他任何事情。 如果交易的目標是一個智能合約,合約一旦被觸發 ,它就可以自動運行合約代碼 。
2.2 調用原理
1). 當合約調用時,虛擬機為被調用的合約創建一塊全新的內存區域,以及能夠訪問調用的Payload (由被稱為“ calldata " 的獨立區域所提供的數據)。
2). 當調用執行結束后,返回數據將被存儲在調用者預先分配好的一塊內存中 。調用層數被限制為 1024 ,因此對于更加復雜的操作,我們應該使用循環而不是遞歸 。
3). 合約代碼能夠讀、寫其自身的內部存儲(一個匹配32字節密鑰與32字節數值的數據庫),讀出所接收消息的存儲數據,向另一個合約發送消息,反過來觸發其執行。 賬戶存儲則是與合約賬戶綁定的持久化存儲,在合約 B 的代碼執行過程中,可以對 B 的賬戶存儲進行讀寫操作。
4).一旦合約執行停止 , 由合約停止發出的消息觸發的所有子代碼也將停止(在一個確定性同步順序環境中,父函數下一步操作執行之前 , 所有調用的子函數必須先執行完成),執行環境中止, 直到由下一次交易喚醒。
一個合約可以決定剩余 gas 的分配 。比如在內部消息調用時使用多少 gas,或者期望保留 多少 gas 。 如果在內部消息調用時發生了費用不足( out-of-gas )異常(或者其他異常),合約將會得到通知(異常會“冒泡”到合約的調用核)
總結
以上是生活随笔為你收集整理的以太坊知识教程------智能合约(2)调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊知识教程------智能合约(1)
- 下一篇: 以太坊知识教程------智能合约(2)