这篇博客演示的基本操作系统环境是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文件如下:

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

二.账户相关API

1.查看所有可用账户

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

2.查看账户余额

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

三、交易相关API

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

1.账户之间转账交易

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

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

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

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

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

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

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

$ npm install --save ethereumjs-tx@1.3.3

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

//引入web3
var Web3 = require("web3");
//创建web3对象
var web3 = new Web3();
//链接到以太坊节点
web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'));/** (1)创建待发送的交易 */
var address = "0xeaf9e84c229c9b1023dd9f8315c01045dd7b741d";
var nonce = web3.eth.getTransactionCount(address,'pending');
var amount = web3.toWei(1,"ether");
var rawTx = {from:address,to:"0xb4f58a932a1cadf638f8e0eafce9bda71144c56e",value:web3.toHex(amount),nonce:web3.toHex(nonce),gasLimit:web3.toHex("49674")
}/**(2).给交易添加签名 */
//引入'ethereumjs-tx'包
var Tx = require('ethereumjs-tx');//创建raw transaction
var tx = new Tx(rawTx);//from地址的私钥
var privateKey = new Buffer('9ff1ba4ce83afdfb326fb68b00997f93277d3fd4c606fd61b5c5484bed92d369','hex');//使用私钥给rawTx签名
tx.sign(privateKey);//签名后的交易
var serializedTx = tx.serialize();
//控制台输出签名后交易信息
console.log(serializedTx.toString('hex'));/**(3)发送已签名交易*/
//发送成功后会返回一个交易的hash值
web3.eth.sendRawTransaction('0x' + serializedTx.toString('hex'), function(err,hash) {if (!err) {console.log(hash);} else {console.log(err);}
});

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

f867808082c20a94b4f58a932a1cadf638f8e0eafce9bda71144c56e880de0b6b3a7640000801ba04538ca57dd5b47173e58a4fe6868408ddeb2e6832524517c423e9e421e4bb736a01b4cd69f9519549bcf53b87edb364958aed0846194ee820fbf34affa7bf20445
0x9b1ef283db7211968b76520466942ae417cc1ac18ec761202a01065e71c768a3

3.调用合约

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

pragma solidity >=0.4.21 <0.6.0;contract Storage {uint256 public storedData;function set(uint256 data) public {storedData = data;}function get() public returns (uint256) {return storedData;}
}

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

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

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

abi: [{constant: true,inputs: [],name: "storedData",outputs: [{...}],payable: false,stateMutability: "view",type: "function"}, {constant: false,inputs: [{...}],name: "set",outputs: [],payable: false,stateMutability: "nonpayable",type: "function"}, {constant: true,inputs: [],name: "get",outputs: [{...}],payable: false,stateMutability: "view",type: "function"}]

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

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

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

  • 通过合约地址加合约接口描述文件。
  • 通过合约地址加被调用合约的函数签名。

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

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

执行交易:

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

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

var tx_set = {"from": "0x8c7ae59ab7e5d510ae3f09a9544978f50315b5f5","to": "0xb69ff7afae8e014f76a4ad1a693076f9197620f8","gaslimit": web3.toHex("50000"),"data": "0x" + "60fe47b1" + "0000000000000000000000000000000000000000000000000000000000000001"
};
//执行交易,(需要解锁账户、挖矿)返回交易hash
> var txId = web3.eth.sendTransaction(tx_set);
> txId
"0xb20213f7e852a619a81abe0019da3c998ea84ac94953443b5afb6903044584a7"
> var result = web3.eth.call(tx_get);
console.info(result);
//正确返回结果应该为1

以太坊学习路线——(二、下)以太坊编程接口:web3.js相关推荐

  1. 以太坊开发攻略五:以太坊的编程接口web3.js API的使用上:转账

    以太坊开发攻略一:准备篇上:各种相关工具安装和环境配置 以太坊开发攻略二:准备篇下:以太坊的编译.安装 以太坊开发攻略三:以太坊私有链的搭建(基于ethash共识挖矿) 以太坊开发攻略四:以太坊私有链 ...

  2. 以太坊学习路线——(四、上)Truffle安装、truffle项目创建、编译、部署

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第十章(吴寿鹤.冯翔.刘涛.周广益   著).鉴于内容较多,分成两篇,下一篇博文请见:以太坊学习 ...

  3. 以太坊学习路线——(五)DApp开发:简易版去中心化微博

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第十一章(吴寿鹤.冯翔.刘涛.周广益   著). 项目地址,包含该项目所需大部分文件,前端因为依 ...

  4. Python学习教程(Python学习路线):Day14A-网络编程入门

    Python学习教程(Python学习路线):网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机 ...

  5. zynq7000 学习(二十四)VGA 接口原理分析和控制逻辑的实现学习

    VGA 接口原理分析和控制逻辑的实现学习 学习内容 本课程首先 进行 VGA 接口 的原理介绍,然后 编写逻辑 控制代码,最终进行 仿真和实现. 本课程 主要包括原理介绍和 设计实现 两个部分. 原理 ...

  6. 以太坊学习路线——(二、上)搭建testrpc测试链

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第五章(吴寿鹤.冯翔.刘涛.周广益   著).首先请自行搜索安装并更新nodejs到较高版本. ...

  7. 以太坊学习路线——(三)Solidity常用IDE搭建、合约编译、部署、调用

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第七.九章(吴寿鹤.冯翔.刘涛.周广益   著). 一.常用IDE 1.remix:是一个浏览器 ...

  8. 以太坊学习路线——(一)私有链搭建与基本操作

    这篇博客演示的基本操作系统环境是CentOS 7,参考书籍:以太坊开发实战--以太坊关键技术与案例分析 第五章(吴寿鹤.冯翔.刘涛.周广益   著). 文章结构: 一.geth客户端安装 二.搭建一个 ...

  9. CSS 学习路线(二)选择器

    选择器 规则结构: 分两个基本部分 选择器(selector)和声明块(declaration block) 组成 声明块:由一个或多个声明组成,每一个声明都是属性-值对 选择器分为:元素选择器,类选 ...

最新文章

  1. @Aspect注解无效
  2. 【推导】【NTT】hdu6061 RXD and functions(NTT)
  3. 假设你有一个数组,其中第i 个元素是第i天给定股票的价格。设计算法以找到最大利润。你可以根据需要完成尽可能多的交易(即,多次买入并卖出一股股票)。注意:您不能同时进行多笔交易(即,您必须在再次购买之前
  4. 2016十大优秀jQuery插件推荐
  5. python精确运算_Python:执行精确的浮点数运算
  6. OpenStack基础知识
  7. 强制 转换string 的一个简单方法(笔记)
  8. 日期插件My97DatePicker
  9. 用Alamofire进行网络请求的一段代码解析(一)
  10. arm体系结构与编程_ARM体系结构基础(1)
  11. javascript设计模式之发布订阅模式
  12. 伍楼阁使用的WordPress代码高亮插件使用说明
  13. 2019-12-19
  14. 【转载】project2019安装教程
  15. 渗透测试工程师常见面试33题——应届生
  16. 互联网日报 | 1月30日 星期六 | 苹果单季营收首破1000亿美元;特斯拉连续六个季度盈利;全球新冠肺炎确诊病例超1亿例...
  17. 老男孩教育Linux50期远程控制连接
  18. hive大数据量实现分页查询,java结合mybatis及多数据源(hive、MySQL)
  19. 苹果cmsv10仿bt部落天堂简约好看的自适应免费模板
  20. 西安财经大学计算机考研科目,西安财经大学2020年硕士研究生考试复试科目与参考书目...

热门文章

  1. oracle 查看考试成绩,oracle认证考试成绩如何查询?
  2. Linguistic Data Consortium (LDC) 介绍
  3. zcmu1064: 计算旅途时间
  4. 你头疼的ELK难题,本文几乎都解决了
  5. 【电源专题】开关稳压器vs线性稳压器
  6. 年轮广场-NC13583(暴力)
  7. mdltxdy mjj的英语单词(4.2洛谷比赛中的字符串问题)
  8. jQuery移动端手机键盘输入车牌号代码【附加新能源车牌】
  9. B - LIS LCS
  10. daterangepicker.js快捷筛选项的高亮显示问题修复