区块链智能合约
区块链智能合约
以太坊合约类型
-
ERC-20: 这是最初的代币标准,用于创建可替代的代币。这些代币在功能上相似,每个代币都是完全相同且不可区分的。
-
ERC-721: 用于创建非替代性代币(NFTs),使得每个代币都是唯一的,可以代表不同的资产,如艺术品、收藏品等。
-
ERC-1155: 结合了ERC-20和ERC-721的特点,允许一个合约包含可替代和非替代的代币。这种多代币标准为游戏和应用提供了极大的灵活性。
-
ERC-777: 作为ERC-20的后续者,引入了一些新的特性,如钩子函数,允许代币合约在转账和接收时执行额外的逻辑。它旨在提高交易的安全性和操作的灵活性。
-
ERC-223: 类似于ERC-20,但增加了避免代币意外丢失的机制。在代币转移到合约时,如果合约不支持代币接收,转账将失败并撤销。
-
ERC-827: 对ERC-20进行了扩展,增加了在转账时调用另一个合约的能力。这使得代币可以在转账的同时执行更复杂的操作。
-
ERC-998: 一个复合代币标准,允许非替代性代币(NFTs)拥有其他ERC-20或ERC-721代币。这适用于需要表达所有权层次结构的场景。
-
ERC-1400: 是一个安全代币标准,旨在增加金融市场的合规性。它引入了分区,以及其他特性,以支持更复杂的资产管理要求。
开源保险公司保单上链ERC-721智能合约
gitee地址 https://gitee.com/lang_junnan_admin/insurance-contract
基于以太坊编写一个erc20智能合约-入门案例
一、准备工作
发布一个智能合约到区块链上是需要一定的gas费用的,就是手续费,所以我们首先需要创建一个钱包,我们可以在谷歌浏览器中安装一个小插件,叫MetaMask 小狐狸如下图,然后创建一个账号
二、编写合约代码
pragma solidity ^0.4.16; contract TokenERC20 { string public name; // 代币名称 string public symbol; // 代币符号 uint8 public decimals = 18; // 18 是建议的默认值 uint256 public totalSupply; // 总供应量 mapping (address => uint256) public balanceOf; // 每个地址的余额 mapping (address => mapping (address => uint256)) public allowance; // 每个地址授权给其他地址的额度 event Transfer(address indexed from, address indexed to, uint256 value); // 转账事件 event Burn(address indexed from, uint256 value); // 销毁事件 // 构造函数,初始化代币信息和总供应量 function TokenERC20(uint256 initialSupply, string tokenName, string tokenSymbol) public { totalSupply = initialSupply * 10 ** uint256(decimals); balanceOf[msg.sender] = totalSupply; name = tokenName; symbol = tokenSymbol; } // 内部转账函数 function _transfer(address _from, address _to, uint _value) internal { require(_to != 0x0); require(balanceOf[_from] >= _value); require(balanceOf[_to] + _value > balanceOf[_to]); uint previousBalances = balanceOf[_from] + balanceOf[_to]; balanceOf[_from] -= _value; balanceOf[_to] += _value; Transfer(_from, _to, _value); assert(balanceOf[_from] + balanceOf[_to] == previousBalances); } // 转账函数 function transfer(address _to, uint256 _value) public returns (bool) { _transfer(msg.sender, _to, _value); return true; } // 从授权账户转账函数 function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(_value <= allowance[_from][msg.sender]); // 检查授权额度 allowance[_from][msg.sender] -= _value; _transfer(_from, _to, _value); return true; } // 授权额度函数 function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; return true; } // 销毁代币函数 function burn(uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value); balanceOf[msg.sender] -= _value; totalSupply -= _value; Burn(msg.sender, _value); return true; } // 从授权账户销毁代币函数 function burnFrom(address _from, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value); require(_value <= allowance[_from][msg.sender]); balanceOf[_from] -= _value; allowance[_from][msg.sender] -= _value; totalSupply -= _value; Burn(_from, _value); return true; } }
三、部署合约
// 1. 导入所需库 const Web3 = require('web3'); const HDWalletProvider = require('@truffle/hdwallet-provider'); const TokenERC20 = artifacts.require("TokenERC20"); // 2. 配置网络提供者 const provider = new HDWalletProvider({ mnemonic: "<YOUR_METAMASK_MNEMONIC>", providerOrUrl: "<YOUR_INFURA_ENDPOINT>" }); const web3 = new Web3(provider); // 3. 部署合约 module.exports = function(deployer) { deployer.deploy(TokenERC20, 1000000, 'TokenName', 'TKN'); };
结论:
需要替换 <YOUR_METAMASK_MNEMONIC>
和 <YOUR_INFURA_ENDPOINT>
分别为你的 Metamask 助记词和 Infura 节点的端点。然后,你可以使用 Truffle 框架的命令行工具来执行这个部署脚本,从而部署合约到以太坊网络中。
部署智能合约需要一定的 GAS 费用,最好是能给你的账号充点钱,你需要确保你的以太坊钱包中有足够的 ETH 用于支付 GAS 费用。部署完成后,你就可以在以太坊网络上使用这个合约了。