区块链智能合约


pragma solidity ^0.8.0; contract NameRegistry { mapping(address => string) public names; function register(string memory name) public { names[msg.sender] = name; } function getName(address addr) public view returns (string memory) { return names[addr]; } }

  

1.这个合约定义了一个名为“NameRegistry”的智能合约,它包含了两个函数:registergetName

register函数允许用户将自己的姓名注册到智能合约中。当用户调用register函数时,它将用户的地址与他的姓名进行映射,并将姓名保存在合约中。

getName函数允许其他用户通过指定地址来检索用户的姓名。当用户调用getName函数时,它将返回该地址映射的姓名。

需要注意的是,在以太坊上运行的智能合约需要消耗一定的燃气费用,以支付计算和存储数据所需的成本。在编写智能合约时,需要考虑到燃气费用和合约安全等方面的问题。

2.部署

安装 Solidity 编译器,用于编译智能合约源代码。您可以使用 Solidity 的在线编译器 Remix 或在本地安装 Solidity。

编写合约代码,并将其保存为 .sol 文件。

使用 Solidity 编译器编译合约代码。在 Remix 中,您可以通过选择“Solidity 编译器”选项卡,选择要编译的 .sol 文件,然后单击“编译”按钮来完成编译。

部署智能合约。在 Remix 中,您可以通过选择“部署和运行交易”选项卡,选择要部署的智能合约,并指定燃气费用和其他参数来部署智能合约。部署后,您将获得一个合约地址,这是智能合约的唯一标识符。

调用智能合约函数。在 Remix 中,您可以通过选择“部署和运行交易”选项卡,选择要调用的函数,并提供必要的参数来调用智能合约函数。在调用函数时,您需要支付燃气费用,这取决于函数的计算复杂度和数据存储量。

请注意,以上流程仅适用于测试和开发环境。在实际部署智能合约时,您需要使用更加安全的方式来保护合约和用户的资产。您还需要考虑智能合约的业务逻辑、安全性、可扩展性等方面的问题。

  

3、调用

配置 Web3.js。Web3.js 是以太坊官方的 JavaScript 客户端库,可以与以太坊节点进行交互。您需要使用 Web3.js 或其他以太坊客户端库来连接到以太坊网络并与智能合约进行交互。您可以通过 npm 安装 Web3.js,或者在浏览器中直接使用预编译的版本。

创建智能合约实例。使用 Web3.js,您可以创建一个智能合约实例,该实例可以与智能合约进行交互。您需要指定智能合约的 ABI(Application Binary Interface,应用程序二进制接口)和地址,以便 Web3.js 可以将函数调用编码为符合以太坊规范的数据格式。

调用智能合约函数。使用智能合约实例,您可以调用智能合约中定义的函数。在调用函数时,您需要提供必要的参数,并指定以太币的数量作为燃气费用。一旦函数调用被成功发送到以太坊网络,您将收到一个交易哈希,用于跟踪交易的状态。

处理交易结果。在交易被确认后,您可以查询交易的状态并处理智能合约的返回值。智能合约的返回值包含在交易的事件日志中,您可以通过 Web3.js 的事件监听器来捕获这些事件并处理返回值。

请注意,以上流程仅适用于测试和开发环境。在实际调用智能合约时,您需要使用更加安全的方式来保护合约和用户的资产,并且需要考虑智能合约的业务逻辑、安全性、可扩展性等方面的问题。

  4.合约授权的例子

pragma solidity ^0.8.0;

contract MyToken {
    mapping(address => uint256) public balances;
    mapping(address => mapping(address => uint256)) public allowances;
    uint256 public totalSupply;
    string public name;
    string public symbol;
    uint8 public decimals;

    constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalSupply) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalSupply;
        balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function transfer(address _to, uint256 _amount) public returns (bool) {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        require(_to != address(0), "Invalid address");
        balances[msg.sender] -= _amount;
        balances[_to] += _amount;
        emit Transfer(msg.sender, _to, _amount);
        return true;
    }

    function approve(address _spender, uint256 _amount) public returns (bool) {
        allowances[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _amount) public returns (bool) {
        require(balances[_from] >= _amount, "Insufficient balance");
        require(allowances[_from][msg.sender] >= _amount, "Insufficient allowance");
        require(_to != address(0), "Invalid address");
        balances[_from] -= _amount;
        balances[_to] += _amount;
        allowances[_from][msg.sender] -= _amount;
        emit Transfer(_from, _to, _amount);
        return true;
    }

    event Transfer(address indexed _from, address indexed _to, uint256 _amount);
    event Approval(address indexed _owner, address indexed _spender, uint256 _amount);
}


这是一个基本的代币合约,其中包含转账、授权和转账从授权的功能。
其中,approve() 函数用于向其他地址授权转移代币的权限,而 transferFrom() 函数用于在获得授权后从授权地址转移代币。在授权操作中,需要传递授权的地址和授权的数量,
这些数据可以通过 DApp 前端界面实现用户交互,并使用 Metamask 等钱包进行交互和签名。

  

posted @ 2023-03-16 16:28  it世界库  阅读(66)  评论(0编辑  收藏  举报