当前位置:   article > 正文

以太坊学习路线——(二、下)以太坊编程接口:web3.js_console.log(txreceipt);

console.log(txreceipt);

这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战——以太坊关键技术与案例分析 第六章(吴寿鹤、冯翔、刘涛、周广益   著)。要运行本博文相关程序,需要搭建以太坊私有链安装testrpc


文章结构:

一.安装与启动web3.js

二.账户相关API

1.查看所有可用账户

2.查看账户余额

三、交易相关API

1.账户之间转账交易

2.发送一个已经签名的转账交易

3.调用合约


一.安装与启动web3.js

$ npm install --save web3@0.20.0

首先在一个终端中运行testrpc以启动测试链,然后在另一个终端,编写相关js文件。这里编写test.js文件如下:

  1. var Web3 = require("web3");
  2. //创建web对象
  3. var web3 = new Web3();
  4. //连接到以太坊节点
  5. web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));
  6. //列出所有的可用用户
  7. var accounts = web3.eth.accounts;
  8. console.info(accounts);
  1. //编写完成后执行如下命令运行js文件
  2. [root@localhost geth]# node test.js
  3. //以下为输出结果,即所有可用账户
  4. [ '0x623053f6e32ea1740ab791fae0e2e402b367e501',
  5. '0xc8f4672e8e988df4d5f6ee9c1322eba005583267',
  6. '0x242e2ad79192f5f28c13d6d9ee57976ef346d63f',
  7. '0x88304656b1031469af4412df4b2de8b2c7759385',
  8. '0x55b0d4de3900b00c7ac1c5ede911a832c3f0ec91',
  9. '0xaf767e3d3da4b8bcba5ca9978d5ca4a7bdf6532f',
  10. '0x7ce1fd31c404682eba0d7fd33d8635c47ee2cc4b',
  11. '0x40023a7f603fd4fc9675c1670b249d054ae33eef',
  12. '0xa723cea532564ded55ad8e6256fb016d25cf18b5',
  13. '0x49ab097da3c5089764e0d5c4117f950263274c0b' ]
  14. //而在testrpc终端下,可以看到对测试链的操作:eth_accounts
  15. …………
  16. …………
  17. HD Wallet
  18. ==================
  19. Mnemonic: penalty silk correct trial good drama action arctic drip rebel weather level
  20. Base HD Path: m/44'/60'/0'/0/{account_index}
  21. Listening on localhost:8545
  22. eth_accounts

二.账户相关API

1.查看所有可用账户

  1. var accounts = web3.eth.accounts;
  2. console.info(accounts);

2.查看账户余额

  1. //查看accounts[0]账户的余额,返回的余额是以wei为单位表示的
  2. var balance_1 = web3.eth.getBalance(web3.eth.accounts[0]);
  3. //将余额用ether为单位表示
  4. var balance_eth = web3.fromWei(balance_1,"ether");
  5. console.log(balance_eth.toString());

三、交易相关API

在以太坊中两个账户之间的转账操作可以当作时一个交易,同样调用智能合约中的函数也可以当作时一个交易。

1.账户之间转账交易

在转账之前如果我们不知道需要给交易设置多少gas,可以通过下面的语句估算并本次交易大概需要消耗的gas:

  1. var estimate_gas = web3.eth.estimateGas({
  2. from: web3.eth.accounts[0],
  3. to: web3.eth.accounts[1],
  4. value: web3.toWei(1,"ether")
  5. });
  6. console.log(estimate_gas);//21000

一般简单的转账交易通常会花费21000gas,得到gas后便可以构建一个转账交易了。转账交易组成部分:

  • from:交易发送这的地址,这笔交易最后需要from的私钥签名。
  • to:接收这笔交转账的目的地址。
  • value:接收这笔交易转账的金额,以wei为单位。
  • gas:这笔交易中可使用的gas,未使用的gas会被退回。
  • gasPrice:这笔交易中附加的gas价格,默认是网络gas价格的平均值。
  1. //开始转账操作
  2. var txId = web3.eth.sendTransaction({
  3. from: web3.eth.accounts[0],
  4. to: web3.eth.accounts[1],
  5. value: web3.toWei(1,"ether"),
  6. gas: estimate_gas
  7. });
  8. //返回值为交易hash
  9. console.log(txId);//0x24ab2da77fe1cc65e75a7b9e8d51b058becd4fd8a3a67b765974bf2f692bd898
  1. testrpc终端显示内容:
  2. Transaction: 0x24ab2da77fe1cc65e75a7b9e8d51b058becd4fd8a3a67b765974bf2f692bd898
  3. Gas usage: 21000
  4. Block Number: 1
  5. Block Time: Sat Mar 30 2019 17:44:04 GMT+0800 (Hong Kong Standard Time)
  1. //查询转账交易详情
  2. var tx = web3.eth.getTransaction(txId);
  3. console.log(tx);
  4. //输出结果
  5. { hash:
  6. '0x498c3835a3eeeb8d9a8f398aa036cd6c59a81bdd5af2390bd518bb9aa7622c70',
  7. nonce: 1,
  8. blockHash:
  9. '0x51b5cb1aa7a1258070ba2586c57f224ead9fd10c745af802f018ea56a41e09a1',
  10. blockNumber: 2,
  11. transactionIndex: 0,
  12. from: '0x623053f6e32ea1740ab791fae0e2e402b367e501',
  13. to: '0xc8f4672e8e988df4d5f6ee9c1322eba005583267',
  14. value: BigNumber { s: 1, e: 18, c: [ 10000 ] },
  15. gas: 21000,
  16. gasPrice: BigNumber { s: 1, e: 0, c: [ 1 ] },
  17. input: '0x0' }
  1. //查询交易收据详情
  2. var tx_receipt = web3.eth.getTransactionReceipt(txId);
  3. console.log(tx_receipt);
  4. //输出结果
  5. { transactionHash:
  6. '0x498c3835a3eeeb8d9a8f398aa036cd6c59a81bdd5af2390bd518bb9aa7622c70',
  7. transactionIndex: 0,
  8. blockHash:
  9. '0x51b5cb1aa7a1258070ba2586c57f224ead9fd10c745af802f018ea56a41e09a1',
  10. blockNumber: 2,
  11. gasUsed: 21000,
  12. cumulativeGasUsed: 21000,
  13. contractAddress: null,
  14. logs: [],
  15. status: 1 }

2.发送一个已经签名的转账交易

上面发起交易的帐号都存储在我们连接的以太坊节点中,如果我们自己有一个帐号,并且这个帐号不存储在我们连接的以太坊节点中,那么我们就需要通过web3.eth.sendRawTransaction方法完成交易的签名与发送。

在后面操作中,要给刚刚创建的交易rawTx加上签名时,需要使用另外一个库:

$ npm install --save ethereumjs-tx@1.3.3

 建立test.js,编辑如下内容,完成后在test.js同一目录下,执行node test.js来加载运行。

  1. //引入web3
  2. var Web3 = require("web3");
  3. //创建web3对象
  4. var web3 = new Web3();
  5. //链接到以太坊节点
  6. web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));
  7. /** (1)创建待发送的交易 */
  8. var address = "0xeaf9e84c229c9b1023dd9f8315c01045dd7b741d";
  9. var nonce = web3.eth.getTransactionCount(address,'pending');
  10. var amount = web3.toWei(1,"ether");
  11. var rawTx = {
  12. from:address,
  13. to:"0xb4f58a932a1cadf638f8e0eafce9bda71144c56e",
  14. value:web3.toHex(amount),
  15. nonce:web3.toHex(nonce),
  16. gasLimit:web3.toHex("49674")
  17. }
  18. /**(2).给交易添加签名 */
  19. //引入'ethereumjs-tx'
  20. var Tx = require('ethereumjs-tx');
  21. //创建raw transaction
  22. var tx = new Tx(rawTx);
  23. //from地址的私钥
  24. var privateKey = new Buffer('9ff1ba4ce83afdfb326fb68b00997f93277d3fd4c606fd61b5c5484bed92d369','hex');
  25. //使用私钥给rawTx签名
  26. tx.sign(privateKey);
  27. //签名后的交易
  28. var serializedTx = tx.serialize();
  29. //控制台输出签名后交易信息
  30. console.log(serializedTx.toString('hex'));
  31. /**(3)发送已签名交易*/
  32. //发送成功后会返回一个交易的hash值
  33. web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err,hash) {
  34. if (!err) {
  35. console.log(hash);
  36. } else {
  37. console.log(err);
  38. }
  39. });

运行成功后,控制台返回如下内容,即签名后的交易信息和交易发送成功后的交易hash值

  1. f867808082c20a94b4f58a932a1cadf638f8e0eafce9bda71144c56e880de0b6b3a7640000801ba04538ca57dd5b47173e58a4fe6868408ddeb2e6832524517c423e9e421e4bb736a01b4cd69f9519549bcf53b87edb364958aed0846194ee820fbf34affa7bf20445
  2. 0x9b1ef283db7211968b76520466942ae417cc1ac18ec761202a01065e71c768a3

3.调用合约

在以太坊中可以通过交易调用智能合约中的函数,首先编写要使用的只能合约:

  1. pragma solidity >=0.4.21 <0.6.0;
  2. contract Storage {
  3. uint256 public storedData;
  4. function set(uint256 data) public {
  5. storedData = data;
  6. }
  7. function get() public returns (uint256) {
  8. return storedData;
  9. }
  10. }

  然后把合约部署到以太坊网络上,合约部署成功后会得到三个比较重要的东西:

(1).合约地址:"0xb69ff7afae8e014f76a4ad1a693076f9197620f8"

(2).合约的接口描述文件:

  1. abi: [{
  2. constant: true,
  3. inputs: [],
  4. name: "storedData",
  5. outputs: [{...}],
  6. payable: false,
  7. stateMutability: "view",
  8. type: "function"
  9. }, {
  10. constant: false,
  11. inputs: [{...}],
  12. name: "set",
  13. outputs: [],
  14. payable: false,
  15. stateMutability: "nonpayable",
  16. type: "function"
  17. }, {
  18. constant: true,
  19. inputs: [],
  20. name: "get",
  21. outputs: [{...}],
  22. payable: false,
  23. stateMutability: "view",
  24. type: "function"
  25. }]

(3).合约的签名,合约函数的获取方式如下:

  1. //将合约的get()方法经过sha3计算后,取除了0x外的前面的8
  2. > var get_func_sign = web3.sha3('get()').substr(2,8);
  3. //将合约的set(uint256)方法经过sha3计算后,取除了0x外的前面的8
  4. > var set_func_sign = web3.sha3('set(uint256)').substr(2,8);
  5. //查看函数签名
  6. > set_func_sign
  7. "60fe47b1"
  8. > get_func_sign
  9. "6d4ce63c"

目前有两种方法可以调用合约:

这里介绍第二种方式,首先构建一个调用get方法的交易:

  1. var tx_get = {
  2. "from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5",
  3. "to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8",
  4. "data": "0x" + "6d4ce63c" + "0000000000000000000000000000000000000000000000000000000000000000"
  5. };
  • from:交易发起者地址。
  • to:合约地址。
  • data:传给合约的参数,由0x、6d4ce63c和参数0000000000000000000000000000000000000000000000000000000000000000组成,因为要调用get方法不需要传递参数,所以这里为传入的为0。

执行交易:

  1. > var result = web3.eth.call(tx_get);
  2. undefined
  3. > console.info(result);
  4. 0x

执行完成后返回的是0,因为还没有给storedData设置值。所以需要调用set方法给storedData设置一个值,首先需要构建一个set方法的交易,并设置set函数传入值为1。

  1. var tx_set = {
  2. "from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5",
  3. "to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8",
  4. "gaslimit": web3.toHex("50000"),
  5. "data": "0x" + "60fe47b1" + "0000000000000000000000000000000000000000000000000000000000000001"
  6. };
  1. //执行交易,(需要解锁账户、挖矿)返回交易hash
  2. > var txId = web3.eth.sendTransaction(tx_set);
  3. > txId
  4. "0xb20213f7e852a619a81abe0019da3c998ea84ac94953443b5afb6903044584a7"
  1. > var result = web3.eth.call(tx_get);
  2. console.info(result);
  3. //正确返回结果应该为1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/419611
推荐阅读
相关标签
  

闽ICP备14008679号