ether.js 重载方法

JavaScript045

ether.js 重载方法,第1张

用ether.js 调用 safeTransferFrom 方法时总是报 safeTransferFrom is not a function 错误

在ERC721中 safeTransferFrom 是重载方法 单独根据方法名去找 就会找到两个 。

也就是contract.safeTransferFrom(…) 这种写法是有问题的。

错误写法

正确写法

参考 https://stackoverflow.com/questions/68289806/no-safetransferfrom-function-in-ethers-js-contract-instance

交易

区块链交易的行为遵循不同的规则集

由于公共区块链分布式和无需许可的性质,任何人都可以签署交易并将其广播到网络。

根据区块链的不同,交易者将被收取一定的交易费用,交易费用取决于用户的需求而不是交易中资产的价值。

区块链交易无需任何中央机构的验证。仅需使用与其区块链相对应的数字签名算法(DSA)使用私钥对其进行签名。

一旦一笔交易被签名,广播到网络中并被挖掘到网络中成功的区块中,就无法恢复交易。

以太坊交易结构

以太坊交易的数据结构:交易0.1个ETH

{

'nonce':'0x00',  // 十进制:0

'gasLimit': '0x5208', //十进制: 21000

'gasPrice': '0x3b9aca00', //十进制1,000,000,000

'to': '0x17A98d2b11Dfb784e63337d2170e21cf5DD04631' ,//发送地址

'value': '0x16345785d8a0000',//100000000000000000 ,10^17

'data': '0x', // 空数据的十进制表示

'chainId': 1 // 区块链网络ID

}

这些数据与交易内容无关,与交易的执行方式有关,这是由于在以太坊中发送交易中,您必须定义一些其他参数来告诉矿工如何处理您的交易。交易数据结构有2个属性设计"gas": "gasPrice","gasLimit"。

"gasPrice": 单位为Gwei, 为 1/1000个eth,表示交易费用

"gasLimit": 交易允许使用的最大gas费用。

这2个值通常由钱包提供商自动填写。

除此之外还需要指定在哪个以太坊网络上执行交易(chainId): 1表示以太坊主网。

在开发时,通常会在本地以及测试网络上进行测试,通过测试网络发放的测试ETH进行交易以避免经济损失。在测试完成后再进入主网交易。

另外,如果需要提交一些其它数据,可以用"data"和"nonce"作为事务的一部分附加。

A nonce(仅使用1次的数字)是以太坊网络用于跟踪交易的数值,有助于避免网络中的双重支出以及重放攻击。

以太坊交易签名

以太坊交易会涉及ECDSA算法,以Javascript代码为例,使用流行的ethers.js来调用ECDSA算法进行交易签名。

const ethers = require('ethers')

const signer = new ethers.Wallet('钱包地址')

signer.signTransaction({

 'nonce':'0x00',  // 十进制:0

   'gasLimit': '0x5208', //十进制: 21000

   'gasPrice': '0x3b9aca00', //十进制1,000,000,000

   'to': '0x17A98d2b11Dfb784e63337d2170e21cf5DD04631' ,//发送地址

   'value': '0x16345785d8a0000',//100000000000000000 ,10^17

   'data': '0x', // 空数据的十进制表示

   'chainId': 1 // 区块链网络ID

})

.then(console.log)

可以使用在线使用程序Composer将已签名的交易传递到以太坊网络。这种做法被称为”离线签名“。离线签名对于诸如状态通道之类的应用程序特别有用,这些通道是跟踪两个帐户之间余额的智能合约,并且在提交已签名的交易后就可以转移资金。脱机签名也是去中心化交易所(DEXes)中的一种常见做法。

也可以使用在线钱包通过以太坊账户创建签名验证和广播。

使用Portis,您可以签署交易以与加油站网络(GSN)进行交互。

链乔教育在线旗下学硕创新区块链技术工作站是中国教育部学校规划建设发展中心开展的“智慧学习工场2020-学硕创新工作站 ”唯一获准的“区块链技术专业”试点工作站。专业站立足为学生提供多样化成长路径,推进专业学位研究生产学研结合培养模式改革,构建应用型、复合型人才培养体系。

本文仅介绍以太坊系列的DApp开发,其他链原理差不太多。

MetaMask安装完成并运行后,可以在Chrome控制台打印 MetaMask注入的window.ethereum对象

关于ethereum对象,我们只需要关心 ethereum.request 就足够了,MetaMask 使用 ethereum.request(args) 方法 来包装 RPC API。这些 API 基于所有以太坊客户端公开的接口。 简单来说钱包交互的大部分操作都是由 request() 方法实现,通过传入不同的方法名来区分。

⚠️ 即使ethereum对象中提供了chainId,isMetaMask,selectAddress属性,我们也不能完全相信这些属性,他们是不稳定或不标准,不建议使用。我们可以通过上面说的request方法,拿到可靠的数据

钱包通过method方法名,进行对应的实现 以获取钱包地址为例

调用 ethereum.request({ method: "eth_requestAccounts" }) ,钱包实现了该方法,那么就可以拿到钱包的地址了。

MetaMask注入的 window.ethereum 就是一个Provider,一个RPC节点也是一个Provider,通过Provider,我们有了访问区块链的能力。 在连接到钱包的情况下,通常使用钱包的Provider就可以了, ethers.providers.Web3Provider(ethereum)

如果只需要查询一些区块链数据,可以使用EtherscanProvider 和 InfuraProvider 连接公开的 第三方节点服务提供商 。JsonRpcProvider 和 IpcProvider 允许连接到我们控制或可以访问的以太坊节点。

获取当前账户余额

获取最新区块号

其他RPC操作,可以通过 JSON-RPC 查看。

通过 ethers.js 可以连接ERC20的合约,合约编译后会生成ABI,合约部署后,会生成合约地址,开发者通过 ABI和合约地址 ,对合约发送消息。

合约中的方法大致分为两种: 视图方法(免费),非视图方法(消耗Gas) ,可以通过ABI查看方法类型。

⚠️ ERC20需要多加关注的是 Approve() 方法以及 transfer() 和 transferFrom() 的区别 ,授权过的代币,被授权的那一方,可以通过调用 transferFrom() 方法,转走你授权数量内的代币,所以授权是一个很危险的操作,假设你授权了一个不良的合约,那你会面临授权的token被转走的风险,即使你没有泄露私钥助记词。

便利三方库: web3-reactuse-wallet

文档: doc.metamask.io ethers