[学习笔记]记一次使用web3.js连接INFURA公共节点进行以太币转账

江枫思渺然 提交于 2019-12-09 21:52:20

注册infura账号,获取项目工程IDhttps://infura.io/

  • 创建一个项目创建一个自己的项目
  • 安装node.js,新建一个工程目录mkdir web3 && cd web3 && echo {} > package.json 使用npm安装web3.js以及ethereumjs-tx:npm install web3 ethereumjs-tx
  • 对于未知的东西都喜欢先从简单的测试开始一步步去了解,先进行个测试操作:
$ node        
Welcome to Node.js v12.13.0.
Type ".help" for more information.
> var Web3 = require('web3')
undefined
> if (typeof web3 !== 'undefined') {
...     web3 = new Web3(web3.currentProvider);
... } else {
...     web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/19ccd12995a34b9ba3cb71f43473d3f3"));
... }
  • 连接成功打印的内容
Web3 {
  currentProvider: [Getter/Setter],
  _requestManager: RequestManager {
    provider: HttpProvider {
      host: 'https://mainnet.infura.io/v3/19ccd12995a34b9ba3cb71f43473d3f3',
      httpsAgent: [Agent],
      withCredentials: false,
      timeout: 0,
      headers: undefined,
      connected: false
    },
    providers: {
      WebsocketProvider: [Function: WebsocketProvider],
      HttpProvider: [Function: HttpProvider],
      IpcProvider: [Function: IpcProvider]
    },
    subscriptions: {}
  },
  givenProvider: null,
  providers: {
    WebsocketProvider: [Function: WebsocketProvider],
    HttpProvider: [Function: HttpProvider],
    IpcProvider: [Function: IpcProvider]
  },
  _provider: HttpProvider {
    host: 'https://mainnet.infura.io/v3/19ccd12995a34b9ba3cb71f43473d3f3',
  .....
}
  • 获取最新块号
> web3.eth.getBlockNumber().then(console.log)
Promise { <pending> }
> 9075364
  • 返回链上指定地址的账户余额
> web3.eth.getBalance('0x26107fd2d10faeb14bc795664152f873d822746f').then(console.log);
Promise { <pending> }
> 2767424000000000
  • 获取当前的gas价格
> web3.eth.getGasPrice().then(console.log)
Promise { <pending> }
> 2000000000
  • 根据文档以及测试操作基本了解了一些函数的使用,开始编写转账代码进行以太坊转账操作touch transfer.js
// 合约地址
var fromAddr = "0x26107fd2d10faeb14bc795664152f873d822746f";
var fromPrivateKey = "0x00000000000xxxx000x00x00x00x0x0x0x00000";
var toAddr = "0xf3f6A64A203EC45fda1bea0397A749736D4FCF9C";
var Web3 = require("web3");
var fs = require('fs');
var Tx = require('ethereumjs-tx').Transaction;
// 创建web3对象
if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    web3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/v3/19ccd12995a34b9ba3cb71f43473d3f3"));
}

web3.eth.getTransactionCount(fromAddr).then( function(nonce){
  var rawTx = {
      "from": fromAddr,
      "nonce": web3.utils.numberToHex(parseInt(nonce)),
      "gasPrice": web3.utils.numberToHex('2000000000'),
      "gasLimit": web3.utils.numberToHex(50000),
      "to": toAddr,
      "value": web3.utils.numberToHex('2000000000000000'),
      "chainId": 0x01  // mainnet chain
  };

  var privateKey = new Buffer.from(fromPrivateKey, 'hex');
  var tx = new Tx(rawTx);
  tx.sign(privateKey);
  var serializedTx = tx.serialize();
  console.log(serializedTx.toString('hex'));

  web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('transactionHash', function(hash){
      console.log('Txn:' + hash);
   }).on('receipt', function(receipt){
       console.log('Receipt:' + receipt);
   });
});
  • 执行代码进行转账node transfer.js成功会正常打印交易信息
f86a03847735940082c35094f3f6a64a203ec45fda1bea0397a749736d4fcf9c8711c37937e080008025a0a0203906c61cdb47c4cc5c112c9f839f1d8e817f039eb2b484c162982bf5ab4ba067ff5acc8e6dcffe2e13ce2f7a4f5b9acccf7271b1628547c3bb998a7dbebbc8
Txn:0x65a274191d95b57a19fdbe5db59ea6975c36a2a065c41731e03a215906a90987
Receipt:[object Object]
  • https://etherscan.io/查询交易的情况
    转账情况
  • 转账成功,中间百度、google了好多网络文章,都没有可以能够使用的案例,基本上都是过时的案例,最后拼凑完成功转账了,才发现跟文档写的一模一样,没有好好看文档就会走好多弯路
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!