Bootstrap

Smart contract -- 钱包合约

        在区块链的世界里,钱包是存储和管理加密货币的基本工具。今天,我们将通过 Solidity 智能合约来创建一个简单的以太坊钱包。这个钱包将允许用户存入和取出以太坊主币(ETH),并且只有管理员(合约的创建者)可以存入资金。我们来看看如何实现这个功能。

        注意:使用继承时请确保代码的正确性,以防丢失个人财产,在这里友情提示您,不要复制来源不明的solidity代码并进行部署。本文为自己梳理总结,如有不足还请指出,感谢包容。 

        学习更多solidity知识请访问 Github -- solidity基础 ,更多实例在 Smart contract

 

1. 合约概述

我们的目标是创建一个智能合约,实现以下功能:

  1. 存入 ETH:只有管理员可以存入资金。

  2. 取出 ETH:管理员可以指定金额取出资金。

  3. 查询余额:任何人都可以查询合约当前的余额。

 

2. 智能合约的基本结构

首先,我们需要定义一个智能合约,并设置一个管理员地址。管理员是唯一可以存入和取出ETH的账户。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

contract EtherWallet {
    address public owner;

    constructor() {
        owner = payable(msg.sender);
    }
}

在这个合约中,我们定义了一个owner变量,用于存储管理员的地址。在构造函数中,我们将合约的部署者(即msg.sender)设置为管理员。

 

3. 接收以太坊主币

为了允许合约接收ETH,我们需要定义一个回退函数。这个函数会在合约接收到ETH时自动调用。

receive() external payable { }

这个回退函数允许合约接收ETH,而不需要调用任何特定的函数。如果用户尝试调用合约中不存在的函数,并且发送了ETH,合约将自动接收这些ETH。

4. 取出以太坊主币

接下来,我们定义一个withdraw函数,允许管理员从合约中取出ETH。

function withdraw(uint _amount) external {
    require(msg.sender == owner, "caller is not owner");
    payable(msg.sender).transfer(_amount);

    (bool sent, ) = msg.sender.call{value: _amount}("");
    require(sent, "Failed to send Ether");
}

在这个函数中,我们首先检查调用者是否是管理员。如果不是,函数将抛出一个错误。如果是管理员,合约将尝试向管理员发送指定数量的ETH。我们使用transfer函数来发送ETH,并使用call函数来确保发送成功。

 

5. 获取合约余额

最后,我们定义一个getBalance函数,允许任何人查看合约中的ETH余额。

function getBalance() external view returns (uint) {
    return address(this).balance;
}

这个函数返回合约当前的ETH余额,单位为wei。

 

6. 完整的智能合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;

contract EtherWallet {
    address public owner;

    constructor() {
        owner = payable(msg.sender);
    }

    receive() external payable { }

    function withdraw(uint _amount) external {
        require(msg.sender == owner, "caller is not owner");
        payable(msg.sender).transfer(_amount);

        (bool sent, ) = msg.sender.call{value: _amount}("");
        require(sent, "Failed to send Ether");
    }

    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
}

7. 部署和使用合约

  1. 使用 Remix:将上述代码复制到 Remix 中,选择合适的编译器版本(例如 0.8.3)。

  2. 部署到测试网络:选择一个测试网络(如 Ropsten 或 Rinkeby),然后点击部署按钮。部署成功后,合约地址将显示在 Remix 的控制台中。

  3. 存入 ETH:使用管理员账户向合约地址发送以太币。由于合约的 receive 函数限制,只有管理员可以存入资金。

  4. 查询余额:调用 getBalance 函数,查看合约当前的余额。

  5. 取出 ETH:管理员调用 withdraw 函数,指定要取出的金额。资金将发送回管理员账户。

 

8. 总结

        通过这个简单的智能合约,我们实现了一个基本的以太坊钱包功能。管理员可以存入和取出ETH,并且可以随时查看合约的余额。这个合约可以作为更复杂DApp的基础,例如多签钱包或去中心化交易所。

        希望这篇文章对你理解如何使用Solidity创建以太坊钱包智能合约有所帮助。如果你有任何问题或建议,欢迎在评论区留言!

;