ERC20

ERC20 标准只包括接口,并非指标准的代码,而是只要满足了ERC20的接口,你接口包含ERC20 所列出的所有的接口,就代表你满足了ERC20的标准。至于合约中的方法是如何实现的并不关心,合约逻辑如何实现没有强制要求。

ERC20标准的核心函数

  • totalSupply() : token 总量

  • balanceOf(address account) : 某一个账户的当前余额

  • transfer(address recipient, uint256 amount) : 把账户的余额,由当前调用者发送到另一个账户中,是一个写入方法,所以会向链外 暴露出一个标准的transfer事件,通过transfer 可以查看token的流转。

  • approve(address spender, uint256 amount) : 是一个批准,代表着把我账户中数量批准给另一个账户。通过allowance 方法可以查询某一个账户对另一个账户的批准额度有多少。approve 与 transfer 是联合使用的。

  • transferFrom(address sender, address recipient, uint256 amount) : 我们向另一合约存款的时候,另一个合约必须要调用transferFrom,才能把我们账户中的token拿到他的合约中。

  • allowance(address owner, address spender) : 查看一个地址被授权的代币额度。

事件

  • Transfer: 当代币转移时触发。
  • Approval: 当调用 approve() 授权代币使用时触发。

代码

interface IERC20 {
	function totalSupply() external view returns(uint); // 代表当前合约的token总量
	function balanceOf(address account) external view returns (uint);// 某一个账户的当前余额
	function transfer(address recipient, uint amount) external returns (bool); // 由当前调用者发送到另一个账户中,是一个写入方法
	function allowance(address owner, address spender) external view returns (uint);
	// 某一个账户对另一个账户的批准额度有多少

	function approve(address spender, uint amount) external returns(bool); // 批准,代表把我账户的数量批准给另一个账户

	function transferFrom(address sender, address recipient, uint amount) external returns (boll); // 向另一个合约存款时,另一个合约要调用transferFrom,才能把我们账户的token拿到他的合约中

	function Transfer(address indexed from, address indexed to, uint amount);
	function Approval(address indexed owner, address indexed spender, uint amount);
}

contract ERC20 is IERC20 {
	uint public totalSupply; // 代表当前合约的token总量
	mapping(address => uint) public balanceOf; // 地址-> 数字,账本
	mapping(address => mapping(address => uint)) public allowance; // 批准映射,一个嵌套映射。发送者的地址 -> 被批准地址 -> 数量
	string public name = "Test"; // token名称
	string public symbol = "TEST"; // token的缩写,符号
	uint8 public decimals = 18; // token的精度,会有18个0的小数

	// 发送方法
	function transfer(address recipient, uint amount) external returns (bool){
		balanceOf[msg.sender] -= amount; // 发送者账户 - 数量
		balanceOf[recipient] += amount; // 接受者账户 + 数量
		emit Transfer(msg.sender, recipient, amount); // 触发事件,触发标准的transfer事件
		return true;
	
	}


	// 批准方法,修改批准映射
	function approve(address spender, uint amount) external returns(bool){
		allowance[msg.sender][spender] = amount; // spender被授权账户
		emit Approval(msg.sender, spender, amount);
		return true;
	}

	function transferFrom(address sender, address recipient, uint amount) external returns (boll){
		allowance[sender][msg.sender] -= amount; // 给发送者对应被批准账户(当前的消息调用者) 他的被批准额度的映射中 - 这次要发送的数量
		balanceOf[sender] -= amount; // 从发送者的账户中 - 额度
		balanceOf[recipient] += amount; // 在接收者账户中 + 额度
		emit Transfer(sender, recipient, amount); // 触发事件
		return true;
	}
	function mint(uint amount) external { // 铸币方法, 一般是有权限控制的
		balanceOf[msg.sender] += amount; // 消息调用者的账户 + 数量
		totalSupply += amount; // 合约的供应总链 + 数量
		emit Transfer(address(0), msg.sender, amount);
	}
	function burn(uint amount) external { // 销毁方法
		balanceOf[msg.sender] -= amount; // 消息调用者的账户 - 数量
		totalSupply -= amount; // 合约的供应总链 - 数量
		emit Transfer(msg.sender, address(0), amount); // 发送0地址,代表销毁事件
	}
}
### Java 实现 ERC20 代币转账 由于Java本身不是用于编写智能合约的语言,通常Solidity被用来创建和部署基于Ethereum平台上的智能合约。然而,在Java应用程序中可以调用已有的ERC20智能合约的方法来执行诸如转账这样的操作。这可以通过Web3j库完成,它是一个轻量级、高度模块化的Java库,允许开发人员与以太坊区块链交互。 下面展示了一个简单的例子,说明如何利用Web3j在Java程序里发起一次ERC20代币的转账: ```java import org.web3j.protocol.Web3j; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.tx.gas.ContractGasProvider; import org.web3j.crypto.Credentials; import org.web3j.protocol.http.HttpService; public class Erc20Transfer { private static final String contractAddress = "CONTRACT_ADDRESS"; // 替换成实际的合同地址 private static final Credentials credentials = WalletUtils.loadCredentials("password", "/path/to/walletfile"); public static void main(String[] args) throws Exception { Web3j web3j = Web3j.build(new HttpService("https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID")); ContractGasProvider gasProvider = new StaticGasProvider(BigInteger.valueOf(4712388), BigInteger.valueOf(9_000_000)); Token token = Token.load(contractAddress, web3j, credentials, gasProvider); TransactionReceipt receipt = token.transfer("RECIPIENT_ADDRESS", BigDecimal.TEN).send(); System.out.println(receipt.getTransactionHash()); } } ``` 此代码片段展示了怎样加载一个现有的ERC20合约实例并发送一笔交易给指定接收者账户。注意这里的`Token`类代表的是通过web3j自动生成对应特定ERC20标准接口的一个代理对象;为了获取这个类,可能需要先编译相应的solidity源文件或将预定义abi/json映射到此类上[^1]。 对于批量转账功能,则可以根据需求调整上述方法中的逻辑部分,比如循环遍历多个收件人的列表并向他们分别转款一定数量的令牌。不过需要注意的是,每次调用`transfer()`都会产生单独的一笔链上交易费用(gas),因此如果要处理大量收款方的话,考虑优化方案或采用更高效的批处理方式可能会更好一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值