# 區塊鏈原理與應用 HW1 [ToC] <style> img[alt~="w-70"] { width: 70%; } </style> ## 組員名單 - 108321036 莊才賢 - 108321037 林峻葆 ## 程式說明 1. 建立一個具有 Faucet 的合約 1. 檢查 balance 是否足以支付合約內 withdraw function 的值 2. 如果不足以支付,就會回覆一個錯誤訊息 2. Faucet 繼承一個掌管使用者的合約 1. 定義一個 modifier 可以確認是否是合約的擁有者,以進行 ACL 和回覆錯誤訊息 2. 定義一個 destroy function 可以 destroy 這個合約,並將合約剩餘的餘額轉到合約擁有者的身上 ## 執行結果 1. 使用帳號 1 建立合約(並帶有 0.1 balance),這時這個 transaction 同時具有 value 和 data,不僅建立了合約,也把呼叫了合約的 receive function ![w-70](https://i.imgur.com/J30hswg.png) 2. 使用帳號 1 呼叫 withdraw function 提領 0.1 ETH ![w-70](https://i.imgur.com/ReVDM6R.png) 3. 使用帳號 1 再次呼叫 withdraw function 提領 0.1 ETH (此時 balance 為 0 ),這時出現餘額不足的警告 ![w-70](https://i.imgur.com/mTbFYwb.png) 4. 使用帳號 2 刪除合約(因帳號 2 不是合約的擁有者,因此出現不是擁有者的警告) ![w-70](https://i.imgur.com/kflpXhx.png) 5. 使用帳號 2 為合約補充 balance ![w-70](https://i.imgur.com/aGJDFl5.png) 6. 使用帳號 1 將這個合約清除,會發現合約確實將剩餘的資金轉移給使用者,並從 etherscan 中看不到相關的 bytecode ![w-70](https://i.imgur.com/m1QtoJq.png) ## 遭遇的困難與解決方法 1. Q: 發現合約有問題,但是合約不能被撤銷 A: 後來的合約都加上 `selfdestruct` 讓它可以被消除 2. Q: 一開始用的智能合約的版本比較舊,但是 Remix 用的是最新的版本,會無法 conpile A: 加上 `pragma solidity` 就可以先讓 compile 先檢查版本號 3. Q: 在 metamask 的介面忘記切換到 test network 導致看不到跟別人要的測試幣 A:調整設定 ![w-70](https://i.imgur.com/24aigqP.png)