智能合約基本結構
帳戶結構
在Ethereum中是由兩種帳號組成的:
- External Owned Account(EOA) : 為一般使用者的帳號
- 包含nonce
- balance
- Contract Account : 為專門部屬合約的帳號
- nonce,balance
- code hash 為儲存合約程式碼的空間
- storage hash 為需要合約永遠儲存內容的空間,合約執行完也不會被清空
- 要先有EOA才可以創立contract account
帳戶功能
EOA transaction功能:
- 轉Ether(balance)給別人
From:傳輸者 To:接收者 Value:ehter值 Data:備註(非必要)
- 部屬 Contract( Create contract)
From:傳輸者 To:null (表示這是要部屬合約的) Data:把bytecode放進來 Value:可以把ether塞進contract中
- 呼叫 Contract中特定的Function(call contract)
合約需要送一個transcation才會觸發指令
EVM
為了避免合約bytecode在不同的OS、環境中會有不同的運算解果產生,我們將solidity在每個主機的沙盒環境 Ethereum Vurtual Machine(EVM)中執行
結構:
1.Account CodeHash:為此account儲存EVM bytecode的位置,找到之後將EVM bytecode放入Machine State執行
2.Program Counter: 解讀EVM Bytecode
3.Gas: 計算是否有資格可以使用EVM運算合約內容
4.Stack/Memory : 儲存小量/大量資料的空間,執行完會揮發
5.Account Storage: 儲存空間,執行完不會揮發
smart contract 運作流程
部屬合約
1.以solidity將合約內容寫好
2.經由slidity compiler產生Contract ABI,Contract Bytecode
(1) Contract ABI : 可以和較難解讀bytecode之間互動的介面
(2) Contract Bytecode: 實際傳至鏈上的程式碼
3.部屬者寫入bytecode至一條transaction之中
4.礦工看到此條transaction,將bytecode放置鏈上並回傳其在鏈上之位置
呼叫合約
- 呼叫者將參數填入Contract ABI當中
- 呼叫者將以上資料寫入transaction中並繳納gas以當作執行合約費用
- 礦工將transaction放置blockchain上面,並且尋找bytecode在何處並下載
- 礦工將下載好contract bytecode放入自己EVM執行運算出結果
- 礦工計算好output後回傳給呼叫者