1. 區塊鏈撲滿 (ep.9, 10, 11)

閱讀時間約 5 分鐘

1. Part1 收款 (ep.9)

  1. 建立一個合約PiggyBank
  2. 部署時就能收Ether
  3. 部署後也能收Ether
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

contract PiggyBank{
constructor()payable {}
receive() payable external {}
}


2. Part2 Send Ether (ep.10)

  1. 將撲滿中的餘額全部領出
  • 但是沒有限制誰可以領出
  • 誰都可存, 誰都可領
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

contract PiggyBank{
constructor()payable {}
receive() payable external {}
function withdraw() external {
address payable Receiver = payable(msg.sender);
Receiver.transfer(address(this).balance);
}
}


3. Part3 (ep.11)

  • 任何人都有存錢的功能, 但只有擁有者可以提錢
  1. 用constructor設定合約的擁有者
  2. 使用require檢查領錢的發送者是否為合約的擁有者
  3. 使用modifier將檢查套用在昨天的提領功能上

modifier

  • 宣告一個修飾子, 跟宣告函式很像
  • 允許有輸入參數, 寫在()內
  • {}裡就是跟函式本體一樣, 寫各種東西
  • _; 是特殊表示法, 代表原本涵式本體


require


  • 錯誤處理函式 Error Handle Function
  • 當條件為true時, 不會發生事情
  • 反之, 會觸發revert("錯誤原因"), 將交易駁回並回報錯誤原因
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

contract PiggyBank{
// 為這個合約設定擁有者
address public owner;
modifier onlyOwner(){
//檢查擁有者跟發送者是否一樣?
require(owner == msg.sender, "Only owner can call this function");
_;

}
constructor()payable {
owner = msg.sender;
}
receive() payable external {}
// 只有擁有者, 才可以提領這個函式的錢
function withdraw() onlyOwner external {
address payable Receiver = payable(msg.sender);
Receiver.transfer(address(this).balance);
}
}


4. Part4 幫撲滿加上事件 (ep.14)

  1. 建立合約時觸發create(address, value) 的事件
  2. 透過receive 收到錢時, 觸發Receive(address, value)的事件
  3. 提領時, 觸發withdraw(address, value)的事件
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

contract PiggyBank{
address public owner;
// 建造合約的時候
event Create(address owner, uint256 value);
// 收到錢的時候
event Receive(address indexed sender, uint256 value);
// 提領的時候
event Withdraw(address owner, uint256 value);
modifier onlyOwner() {
require(owner == msg.sender, "Only owner can call this function");
_;
}
constructor() payable {
owner = msg.sender;
emit Create(owner, msg.value);
}
receive() payable external{
emit Receive(msg.sender, msg.value);
}
function withdraw() onlyOwner external {
address payable Receiver = payable(msg.sender);
uint256 value = address(this).balance;
Receiver.transfer(value);
emit Withdraw(Receiver, value);
}
}

在 2022 年,我們該如何寫智能合約

尋大神腳印, 亦步亦趨。
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容