Infura:一键接入以太坊

昨天听说了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,点击注册并提供一个邮箱,会收到一封邮件,点击邮件中的链接激活就可以了,然后你就会看到下面的界面:
Infura:一键接入以太坊_第1张图片
点击右上角的黑色按钮,创建新项目,就可以生成你专属的Project ID了(左边的红框)。

接下来你就可以通过JSON RPC访问以太坊网络了,Infura支持主网和多个测试网,这里以Ropsten测试网为例。比如我们想查询一下LOOM(僵尸币)合约中某个账户的余额,首先我们在etherscan上找到LOOM合约的地址:
Infura:一键接入以太坊_第2张图片
点进去以后会有个一个Code标签,里面就是合约代码。把合约代码拷贝到Remix里面,然后点Details就可以看到合约里所有的函数签名(4个字节):
Infura:一键接入以太坊_第3张图片
我们需要查询余额,因此需要调用balanceOf()这个函数。我在etherscan上随便找了个地址0x5f726a5cfcfa578963d2cb319c875968a6232419,然后把函数签名跟地址拼在一起生成交易数据。需要注意的是参数是32个字节,我们的地址只有20个字节,因此前面需要补24个0:

0x70a082310000000000000000000000005f726a5cfcfa578963d2cb319c875968a6232419

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

curl https://mainnet.infura.io/v3/ -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上获取函数签名信息:
Infura:一键接入以太坊_第4张图片
接下来我们需要在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/"));
}

然后填充交易数据,其中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('', '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
Infura:一键接入以太坊_第5张图片

更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock
或关注飞久微信公众号:
Infura:一键接入以太坊_第6张图片

你可能感兴趣的:(区块链)