以太坊钱包开发系列:发送Token

当前位置:首页 > 币圈百科 > 以太坊钱包开发系列:发送Token

以太坊钱包开发系列:发送Token

2022-11-15币圈百科328

以太坊去中心化web钱包开发系列,点击链接观看视频课程,一个可以实际使用的钱包就从零开始开发出来了。这一系列文章是理论和实战的结合,一共有四篇:本文是第四篇。令牌(Token,pass)是以太坊的一大特色。自从钱包开发以来,发送令牌的功能是必不可少的。

点击Token回顾以太坊钱包开发系列:

以太坊钱包开发:创建钱包账户

以太坊钱包开发:导入导出账户Keystore文件

以太坊钱包开发:显示钱包信息并发起签名交易

合约的ABI信息

其次,我们蓑衣网小编2022通常所说的Token,其实指的是符合ERC20标准接口的合约。ERC20接口定义如下:

1234567891011121314151617181920 contract er C20接口{ string public constant name=' token name ';字符串公共常量符号=' SYM ';uint8公共常数小数=0;函数totalSupply()公共常量returns(uint);函数balanceOf(address tokenOwner)公共常量返回(uint balance);函数allowance(address tokenOwner,address spender)公共常量returns(uint remaining);函数approve(地址支出器,uint令牌)public returns (bool成功);函数传递(address to,uint tokens)公共返回(bool success);函数transferFrom(address from,address to,uint tokens)公共返回(bool success);事件传输(从地址变址、地址变址、uint令牌);事件批准(地址索引令牌所有者、地址索引支出者、uint令牌);}

ABI的全称是应用二进制接口,是对契约接口的描述。因此,有了契约的接口定义,通过编译就可以很容易地得到ABI信息。例如,你可以直接在Remix的编译标签中复制ABI,如下所示。

生成的ABI描述看起来是这样的:

12345678910111213141516171819202122223242526272829303132334353637.{ ' constant ' ' name ':蓑衣网小编2022' total supply ',' outputs': [{'name ':' ',' type': 'uint256'}],' payable': false,' State variability':' view ',' type': 'function'},{'constant': true,' inputs': [{'name': 'tokenOwner ',' type': 'address'}],' name': 'balanceOf ',' outputs ':[{ ' name ':' balance ':' balance ',' type': 'uint256'}],' payable': false,State variability ':'.]

是JSON形式的数组。数组中的每个元素都是函数接口的描述,对外调用契约时需要遵循。以上面的接口为例,通常,一个接口描述包含以下字段:

name:函数的事件名称。type:可能的值有function、constructor、fallback、eventinputs:函数的输入参数。每个参数对象包含以下属性:名称:参数名称类型:参数的规范类型。输出:一系列类似输入的对象,如果没有返回值,可以省略。Constant: true表示函数声明不会改变状态变量的值。Payable: true表示函数可以接收ether,否则不能。

接下来,在构造契约对象时,您需要使用ABI。

构造契约对象

ethers.js构造契约对象非常简单。你只需要给醚提供三个参数。具有以下代码的协定构造函数:

123var abi=[.];var addr='0x . ';var合同=新醚。合同(地址、abi、供应商);

可以在部署合同后获取合同的地址。这里不讨论与令牌合约部署和ERC20相关的概念。不熟悉的可以参考我的另一篇文章,创造自己的数字货币。蓑衣网小编2022

只能用?合同?对象来调用令牌协定的函数。

获取令牌余额并转移令牌

获取令牌余额

结合UI实现如下令牌余额,具体如下:

在HTML中,定义的标签如下:

123456 TT令牌:[x//调用合约方法contract . Balance of(active wallet . address)。然后(function(balance){ token balance . val(balance))直接;});

转账令牌

转账令牌的UI效果如下:

界面的HTML代码如下:

123456789101121314151617 转账令牌:

发送到:金额:

虽然令牌转账类似于获取余额,但也是调用契约的方法。但是令牌传递需要发起交易,所以需要测算燃气消耗。点击发送时运行(key)代码:

123456789101121314151617181920212223242526 var InputTargetAddress=$(' # wallet-token-send-target-address ');var input amount=$(' # wallet-token-send-amount ');var submit=$(' # wallet-token-submit-send ');var targetAddress=ethers . utils . get address(inputtargetaddress . val());var amount=input amount . val();Submit.click(function() {//先计算换乘需要的用气量。这一步有一个默认值,不是必需的。合同。估计。转移(目标地址,金额)。然后(function(gas){//必须有一个签名的wallet对象与之关联,let contractwithsigner=contract . connect(active wallet);//发起交易。前两个参数是函数的参数,第三个是交易参数contractwithsigner . transfer(TargetAddress,amount,{气限:气,//lazy,是直接用2g卫气价:ethers.utils.parse units ('2 ',' g Wei ',})。然后(function(tx){ console . log(tx);//介绍刷新上面的令牌余额,重置输入框});});}

以上几点有一点需要注意。在契约调用transfer之前,需要连接一个签名者,因为在发起事务时需要使用它来签名。Wallet是ethers.js API中signer(抽象类)的实现类。

所有将更改区块链数据的功能都需要一个关联的签名者。如果是视图函数,只需要连接到提供者。

ethers . js的契约提供了一个非常方便的方法:contract.estimate.functionName?计算预测交易的gasLimit。

在启动交易时,您可以提供可选的覆盖参数,在该参数中,您可以指定交易的gasLimit和gasPrice。如果不指定这个参数,我们将默认使用contract.estimate获得的值作为gasLimit,使用provider.getGasPrice()的值来指定GasPrice。

哈哈,恭喜大家。这里完全实现了一个基于以太坊的去中心化web钱包。

戳链接观看详细视频课程讲解。

参考文献

Ethers.js

区块链简单来说?——系统学习区块链,打造区块链最好的科技博客。

简单来说,区块链知识星球最专业的技术问答社区。加入社区还可以在微信群里与300多名区块链科技爱好者交流。

以太坊钱包开发系列:发送Token | 分享给朋友: