首页 > 编程知识 正文

以太坊 infura

时间:2023-05-04 18:31:06 阅读:184576 作者:2832

昨天听说了Infura这个项目,就花了点时间了解了一下。

1.什么是Infura?

专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。

通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。

从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。

除此之外,Infura还可以很方便地接入IPFS,这是另外一个话题,这里就不讨论了。

最后,也是非常重要的一点:Infura目前是免费的。

2.如何使用Infura?

使用Infura首先需要注册一个账户,访问官网https://infura.io,点击注册并提供一个邮箱,会收到一封邮件,点击邮件中的链接激活就可以了,然后你就会看到下面的界面:

点击右上角的黑色按钮,创建新项目,就可以生成你专属的Project ID了(左边的红框)。

接下来你就可以通过JSON RPC访问以太坊网络了,Infura支持主网和多个测试网,这里以Ropsten测试网为例。比如我们想查询一下LOOM(僵尸币)合约中某个账户的余额,首先我们在etherscan上找到LOOM合约的地址:

点进去以后会有个一个Code标签,里面就是合约代码。把合约代码拷贝到Remix里面,然后点Details就可以看到合约里所有的函数签名(4个字节):

我们需要查询余额,因此需要调用balanceOf()这个函数。我在etherscan上随便找了个地址0x5f726a5cfcfa578963d2cb319c875968a6232419,然后把函数签名跟地址拼在一起生成交易数据。需要注意的是参数是32个字节,我们的地址只有20个字节,因此前面需要补24个0:

0x70a082310000000000000000000000005f726a5cfcfa578963d2cb319c875968a6232419

接下来就可以用curl发起JSON RPC,查询该账户的余额了:(换成你自己的PROJECT ID)

curl https://mainnet.infura.io/v3/<PROJECT ID> -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0xa4e8c3ec456107ea67d3075bf9e3df3a75823db0", "data":"0x70a082310000000000000000000000005f726a5cfcfa578963d2cb319c875968a6232419"}, "latest"],"id":1 }'

返回结果:

{"jsonrpc":"2.0","id":1,"result":"0x0000000000000000000000000000000000000000000000020f5b1eaad8d80000"}

可以看到,这位兄台的LOOM余额为20f5b1eaad8d80000,转成10进制是38000000000000000000,LOOM的decimal是18,因此这位兄台手里只有38个LOOM币。

3.通过web3.js连接到Infura

这个就比较简单了,说白了就是把Infura作为一个Web3 Provider。

比如我们在Ropsten测试网上部署一个简单合约:

pragma solidity ^0.4.25;contract Demo { int public x; function inc() public { x++; }}

然后在Remix上获取函数签名信息:

接下来我们需要在Javascript中调用该合约。首先安装依赖包:

npm install web3 ethereumjs-tx

接着我们要创建web3对象,记得换成你自己的PROJECT ID:

var Web3 = require('web3') if (typeof web3 !== 'undefined') { web3 = new Web3(web3.currentProvider);} else { web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/<PROJECT ID>"));}

然后填充交易数据,其中nonce是跟账户交易次数相关的,可以通过eth_getTransactionCount接口获得。gasPrice设为0x7739440,也就是2Gwei,gasLimit填一个比较大的值就可以了。我们想调用合约中的inc()函数,因此data就设置为inc()的函数签名。最后通过ethereumjs-tx生成交易:

var rawTx = { nonce: '0x11', gasPrice: '0x77359400', gasLimit: '0xFFFF', to: '0x01d71bc337f95ecbac4bec57fee42082392be0ee', value: '0x00', data: '0x371303c0', // EIP 155 chainId - mainnet: 1, ropsten: 3 chainId: 3}var Tx = require('ethereumjs-tx')var tx = new Tx(rawTx)

接下来需要给交易签名,需要填上你自己账户的私钥:

var privateKey = Buffer.from('<account private key>', 'hex')tx.sign(privateKey)

最后把交易数据序列化,然后调用sendSignedTransaction(老版本web3是sendRawTransaction)发送交易:

var serializedTx = tx.serialize()web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err, hash) { if (!err) { console.log(hash); } else { console.log(err); }});

控制台上会打印出交易的哈希值,可以去etherscan上查询交易是否执行成功。比如我刚刚发起这笔交易就可以在下面的链接中查询到:

https://ropsten.etherscan.io/tx/0x7b62a57aac7ff3e514ac38dcfdd2da9b68f49097bc74cc964e974c3c00766e7e

更多文章欢迎关注“wxdds点灯”专栏:https://blog.csdn.net/turkeycock
或关注飞久微信公众号:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。