来源:小编 更新:2025-01-08 14:04:54
用手机看
区块链的世界里,有一种特殊的语言,它叫做以太坊代币标准代码。想象你手中握着一把神奇的钥匙,可以打开财富的大门,这把钥匙就是ERC-20、ERC-721,甚至是ERC-1155。今天,就让我带你一起探索这个神秘的世界,揭开以太坊代币标准代码的神秘面纱。
在区块链的世界里,代币就像是数字货币的化身,它们代表着价值、权益和身份。而这一切,都始于ERC-20的诞生。
2015年,一个名为“OmiseGO”的项目提出了ERC-20标准,它定义了一套规则,让开发者可以轻松地创建可替代的代币。ERC-20就像是代币的身份证,它规定了代币的基本属性,比如总供应量、账户余额、转账等。
想象你想要创建一个自己的代币,你只需要按照ERC-20的标准来编写代码,你的代币就可以在以太坊网络上流通了。这不就是区块链世界的“魔法”吗?
ERC-20的魔法,其实就在于它的接口和合约。
接口,就像是代币的“说明书”,它定义了代币应该具备哪些功能。在ERC-20中,接口定义了六个必须实现的函数,比如:
- `totalSupply()`:获取代币的总供应量。
- `balanceOf(address account)`:获取指定账户的代币余额。
- `transfer(address recipient, uint256 amount)`:将指定数量的代币从发送者转移到接收者。
而合约,则是实现这些功能的“魔法师”。在Solidity语言中,你可以使用`IERC20`接口来定义代币的接口,然后创建一个合约来实现这些功能。
比如,以下是一个简单的ERC-20代币合约的示例:
```solidity
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
contract MyToken is IERC20 {
mapping(address => uint256) private _balances;
uint256 private _totalSupply;
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public override returns (bool) {
require(_balances[msg.sender] >= amount, \Insufficient balance\);
_balances[msg.sender] -= amount;
_balances[recipient] += amount;
emit Transfer(msg.sender, recipient, amount);
return true;
}
在这个合约中,我们定义了一个名为`MyToken`的代币,它实现了`IERC20`接口中的所有函数。
除了ERC-20,还有ERC-721,它是非同质化代币(NFT)的标准。与ERC-20的可替代代币不同,NFT是独一无二的,就像你的身份证一样,每个人只有一张。
ERC-721的魔法在于它的`tokenURI`函数,它允许你为每个NFT指定一个唯一的标识符。比如,你可以为每个NFT创建一个独一无二的数字艺术品,并将其作为NFT发行。
以下是一个简单的ERC-721合约的示例:
```solidity
pragma solidity ^0.8.0;
interface IERC721 {
function balanceOf(address owner) external view returns (uint256);
function ownerOf(uint256 tokenId) external view returns (address);
function transferFrom(address from, address to, uint256 tokenId) external;
function tokenURI(uint256 tokenId) external view returns (string memory);
contract MyNFT is IERC721 {
mapping(uint256 => address) private _owners;
mapping(address => uint256) private _balances;
function balanceOf(address owner) public view override returns (uint256) {
return _balances[owner];
}
function ownerOf(uint256 tokenId) public view override returns (address) {
require(_owners[tokenId] != address(0), \Token does not exist\);
return _owners[tokenId];
}
function transferFrom(address from, address to, uint256 tokenId) public override {
require(_owners[tokenId] == from, \Not owner\);
_owners[tokenId] = to;
_balances[from]--;
_balances[to]++;
emit Transfer(from, to, tokenId);
}
function tokenURI(uint256 tokenId) public view override returns (string memory) {
// 返回NFT的URL
}
在这个合约中,我们定义