从工作分工上来看,前端工程师完全可以把智能合约看做是一个后端工程师给你的接口,毕竟solidty的主要工作也是处理和返回数据的,和普通的后端工作内容相差不大,只不过代码是部署在区块链上的。
因为代码是部署在区块链上的,所以在发送请求时会与传统的请求有所不同,但本质是一样的,接下来我们要搞清楚以下三点,就能明白它的本质为什么是一样的:
1.什么是abi,我们为什么要用到它
2.为什么要借助第三方包,而不是直接请求服务器,它都有哪些作用
3.请求智能合约的原理是什么,区块是如何执行的
一.什么是abi,我们为什么要用到它
先看代码,因为我对ether比较熟悉,这里用ether做演示:
//区块链本质是由多个服务器跑相同的程序,存储相同的数据,然后不停地相互同步来形成的信任网络
//我们只需要链接其中一个,然后请求这个服务器即可,至于数据同步的事情不用我们处理
//provider我们称之为节点提供者(每个组成区块的服务器我们称之为节点),存储节点信息和地址信息
//我这里模拟的是DAPP的流程,节点和用户的相关信息存在window.ethereum中,可以直接获取
let provider = new ethers.providers.Web3Provider(window.ethereum)
//signer(签名者),该信息存在节点提供者中并自动与节点关联
let signer = provider.getSigner();
//这里将合约地址,abi,还有签名者之间做关联,生成一个合约对象,之后就可以调用合约对象的方法了
let contract= new ethers.Contract('合约地址', erc20abi, signer);
//这里调用了合约代币的转账方法
// ethers.utils.parseEther()是ether.js工具包中的一个方法,可以将数字字符串乘上10**16,没有精度损耗
let data = await contract.transfer("收币地址", ethers.utils.parseEther("1"))
.catch(function(err) {
console.log(err)
})
//data是本次调用生成的链上数据,不是代码执行完后的返回值
console.log(data)
//监听data中的交易hash,来获取交易结果
let data2=await provider.waitForTransaction(data.hash);
console.log(data2)
data返回值:
{
"hash": "0xe632c016cea540b54ccde8343378e615174040fbaae68fce44ab1ea44a89a531",
"type": 0,
"accessList": null,
"blockHash": null,
"blockNumber": null,
"transactionIndex": null,
"confirmations": 0,
"from": "0x173f8Ce8356dD214813f4874C316739F560D8022",
"gasPrice": {
"type": "BigNumber",
"hex": "0x1ff973cafa8000"
},
"gasLimit": {
"type": "BigNumber",
"hex": "0x760e"
},
"to": "0x2c4eb3c76D7115E210Fadf3cBFe8E0a3d5b8448F",
"value": {
"type": "BigNumber",
"hex": "0x00"
},
"nonce": 207,
"data": "0xa9059cbb000000000000000000000000173f8ce8356dd214813f4874c316739f560d80220000000000000000000000000000000000000000000000000de0b6b3a7640000",
"r": "0xd8c09aab22974fc057010152929fcb4b134a431c707c2f212f619f18297eb485",
"s": "0x69f6e8d9f3581625797bc20cfdd2951ef225e5f24366d8f4128e8e6fdfd70316",
"v": 2093,
"creates": null,
"chainId": 1029
}
data2返回值:
{
"to": "0x2c4eb3c76D7115E210Fadf3cBFe8E0a3d5b8448F",
"from": "0x173f8Ce8356dD214813f4874C316739F560D8022",
"contractAddress": null,
"transactionIndex": 0,
"gasUsed": {
"type": "BigNumber",
"hex": "0x6a09"
},
"logsBloom": "0x04000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000008000000800000000000000000000100000000000000000000000020000000000000000000000010000000000080000010000000000000000000040000000000000000000000004000000000000000000000000000200000000000000000000000000400000000000000000000000000000000004000000002000000000001000000000000000000000000000000100000000000400000000000000000000000000000000000000000000000000100000000100000",
"blockHash": "0x7c85a7911b5e9c8fb3bf40898167873e4beccd535407fdae3aea777246014936",
"transactionHash": "0xe632c016cea540b54ccde8343378e615174040fbaae68fce44ab1ea44a89a531",
"logs"