智能合約開發實戰(14) - 實作一個簡單的錢包

更新於 發佈於 閱讀時間約 5 分鐘

介紹了這麼多Solidity的函數和方法,今天來寫一個簡單的錢包,順便介紹一下payable

payable這個標記是什麼呢?payable就是當您想要接收ETH(乙太幣)時,也就是想把ETH存入合約內時,函數上必須標記有payable才行,不然會報錯,常見的是標記在deposit()的function上,這樣才能接收ETH幣。

廢話不多說,下面來看一下程式碼:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

contract Wallet {
  address public owner;

  event Deposit(address sender, uint amount, uint balance);
  event Withdraw(uint amount, uint balance);
  event Transfer(address to, uint amount, uint balance);

  //檢查是否為Owner
  modifier onlyOwner() {
    require (msg.sender == owner, "Not Owner");
    _;
  }

  //初始化
  constructor() payable {
    owner = payable(msg.sender);
  }

  //存款
  function deposit() public payable {
    emit Deposit(msg.sender, msg.value, address(this).balance);
  }

  //查詢餘額
  function getBalance() public view returns (uint) {
    return address(this).balance;
  }

  //取款
  function withdraw(uint amount) public onlyOwner {
    payable(msg.sender).transfer(amount);
    emit Withdraw(amount, address(this).balance);
  }

  //交易給(某人)
  function TransferTo(address payable _to, uint amount) public onlyOwner {
    _to.transfer(amount);
    emit Transfer(_to, amount, address(this).balance);
  }
}

程式碼就如上所示,下面我們來玩看看會是什麼樣的狀況,由此來了解錢包是怎麼運作的:

raw-image

Account選擇第一個帳戶,這樣第一個帳戶就會是Owner,存入10ETH進去錢包,按getBalance會顯示"10000000000000000000",因為顯示的單位是wei,所以10的後面會有18個零,回頭看第一個帳戶只剩下89.9999999個ETH。

接下來我們從第二個帳戶存2個ETH進去錢包:

raw-image

從第2個帳戶存入2個ETH進去錢包,第二個帳戶會少了2個ETH剩下97.9999,不是98是因為還會再扣掉gas fee(手續費),下面我們來操作提款,正常來說因為我們有寫限制式,只有Owner才能提款,所以如果用第2個帳戶會報錯,要用第1個帳戶才能順利提款,下面我們來看一下是不是這樣的:

raw-image
raw-image

最後一步來把剩下的10個ETH交易給第二個帳戶:

raw-image

以上就是一個簡單錢包的基本操作(存款、提款、交易),希望這樣的介紹能讓各位了解一個錢包是怎麼運作的,對錢包有初步的認識,謝謝。

有什麼想要了解或是不清楚的部份,歡迎留言和我分享。
如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。

留言
avatar-img
留言分享你的想法!
賴金洲-avatar-img
2022/07/11
請問getBalance中的 address(this).balance,address(this)指的不是該contract的address嗎? 為什麼這邊不是用 msg.sender.balance呢?
avatar-img
宅D嘉的開發人生
20會員
43內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/28
    每個程式開發的開始都是從Hello World開始的,當然我也不免淑的來個Hello World。
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/22
 Cocos Creator 2D實戰(一) 環境設定 第二步先做環境設定:環境設定、VS Code 正常來說跟著做就可以完成環境設定了,由於是開發2D,所以右上角先選擇2.4版(目前最高版本)會比較好,比較不容易錯亂,畢竟3.x和2.x的差異很大。
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
2025/03/21
Cocos Creator 實戰     Cocos Creator是個用來開發2D或是3D遊戲的整合開發環境(IDE),程式語言是使用Javascript或TypeScript,Unity是用C#,但如果是Cocos Creator 3D的話是只能用TypeScript,所以建議還是用TypeS
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
Solidity支援兩種特殊的函數,分別是Fallback以及Receive,一個是處理合約中不存在的功能時進行的回退機制,而另一個Receive則是負責收款後的動作,但兩者稱為特殊函數的原因主要是跟我們一般函數不同的地方於它們是屬於匿名的函數,也就是不用給定Function名稱,因此才會較為特殊,
Thumbnail
Solidity支援兩種特殊的函數,分別是Fallback以及Receive,一個是處理合約中不存在的功能時進行的回退機制,而另一個Receive則是負責收款後的動作,但兩者稱為特殊函數的原因主要是跟我們一般函數不同的地方於它們是屬於匿名的函數,也就是不用給定Function名稱,因此才會較為特殊,
Thumbnail
資料型態在合約當中扮演著什麼角色呢? 我們在「【開發智能合約 — Solidity系列】實作篇Ep.2 — 合約中的基本組成元素」有介紹過狀態變數可以儲存一些變化值,而儲存什麼類型的值就是所謂的資料型態,不同的資料型態可以處理的事物也有所不同,因此我們也需要了解一些基本的資料型態以及特性之後,未來開
Thumbnail
資料型態在合約當中扮演著什麼角色呢? 我們在「【開發智能合約 — Solidity系列】實作篇Ep.2 — 合約中的基本組成元素」有介紹過狀態變數可以儲存一些變化值,而儲存什麼類型的值就是所謂的資料型態,不同的資料型態可以處理的事物也有所不同,因此我們也需要了解一些基本的資料型態以及特性之後,未來開
Thumbnail
上一篇我們談到「【開發智能合約 — Solidity系列】實作篇Ep.1 — 看懂智能合約的脈絡」,大致上理解每個檔案的每份合約都是一個個的區塊,而這一個篇章主要著重於合約中的每個區塊的組成元素進行分項說明。 今天的範例會以簡單的銀行存款與提款流程進行示範,過程中將一步步的使用上述7種元素完成功能,
Thumbnail
上一篇我們談到「【開發智能合約 — Solidity系列】實作篇Ep.1 — 看懂智能合約的脈絡」,大致上理解每個檔案的每份合約都是一個個的區塊,而這一個篇章主要著重於合約中的每個區塊的組成元素進行分項說明。 今天的範例會以簡單的銀行存款與提款流程進行示範,過程中將一步步的使用上述7種元素完成功能,
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
學了這麼多的Solidity後,該來完整的寫一個ERC20的token,順便也了解一下發幣的邏輯。 然後只要符合下面這些標準的就可以是ERC20: 我們就把上面的這些寫入程式碼中: 有什麼想要了解或是不清楚的部份,歡迎留言和我分享。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
Thumbnail
此篇文是在練習並熟悉solidity與remix的操作
Thumbnail
此篇文是在練習並熟悉solidity與remix的操作
Thumbnail
介紹了這麼多Solidity的函數和方法,今天來寫一個簡單的錢包,順便介紹一下payable。
Thumbnail
介紹了這麼多Solidity的函數和方法,今天來寫一個簡單的錢包,順便介紹一下payable。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News