---
# System prepended metadata

title: 區塊鏈原理與應用 HW1

---

# 區塊鏈原理與應用 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)



