区块链智能合约
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”的智能合约,它包含了两个函数:register
和getName
。
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 等钱包进行交互和签名。