昨天听说了Infura这个项目,就花了点时间了解了一下。
专业一点讲,Infura是一种IaaS(Infrastructure as a Service)产品,目的是为了降低访问以太坊数据的门槛。
通俗一点讲,Infura就是一个可以让你的dApp快速接入以太坊的平台,不需要本地运行以太坊节点。
从程序员的角度讲,Infura就是一个Web3 Provider,背后是负载均衡的API节点集群。使用它的好处就是,你永远不必担心连接的节点失效的问题,Infura会管理好这一切。
除此之外,Infura还可以很方便地接入IPFS,这是另外一个话题,这里就不讨论了。
最后,也是非常重要的一点: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/ -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币。
这个就比较简单了,说白了就是把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/"));
}
然后填充交易数据,其中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
更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock
或关注飞久微信公众号: