1. 程式人生 > >Infura:一鍵接入以太坊

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,點選註冊並提供一個郵箱,會收到一封郵件,點選郵件中的連結啟用就可以了,然後你就會看到下面的介面:
在這裡插入圖片描述
點選右上角的黑色按鈕,建立新專案,就可以生成你專屬的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
在這裡插入圖片描述

更多文章歡迎關注“鑫鑫點燈”專欄:https://blog.csdn.net/turkeycock
或關注飛久微信公眾號:
在這裡插入圖片描述