以太坊(Ethereum)智能合约NodeJS/Web3 使用
一、概述
运行环境:Node.js、npm、Truffle、Solidity等
root@keke:~/go-ethereum# node -v
v8.9.4
root@keke:~/go-ethereum# npm -v
5.7.1
solidity 安装
# npm install -g solc --save
安装solidity的开发框架Truffle4
# npm install -g truffle --save
装开发客户端,在本地模拟以太坊运行环境
当开发基于Truffle4的应用时,我们推荐使用EthereumJS TestRPC。它是一个完整的在内存中的区块链,仅仅存在于你开发的设备上。它在执行交易时是实时返回,而不等待默认的出块时间,这样你可以快速验证你新写的代码,当出现错误时,也能即时反馈给你。它同时还是一个支持自动化测试的功能强大的客户端。Truffle4充分利用它的特性,能将测试运行时间提速近90%。
EtherumJS TestRPC安装好的截图如下,红框内的为RPC Server地址:http://127.0.0.1 ,在后续配置中将会用到。

项目初始化
localhost:# mkdir -p truffle4-demo
localhost:# cd truffle4-demo
localhost:/root/truffle4-demo # truffle init
项目目录结构如下:
root@keke:~/truffle4-demo# tree -L 2
.
├── contracts
│ └── Migrations.sol
├── migrations
│ └── 1_initial_migration.js
├── test
├── truffle-config.js
└── truffle.js
3 directories, 4 files
新建合约
root@keke:~/truffle4-demo# cat contracts/demo.sol
pragma solidity ^0.4.17;
contract Test{
function sayHi() returns (string){
return "hello world";
}
}
修改migrations/1_initial_migration.js 如下:
root@keke:~/truffle4-demo# cat migrations/1_initial_migration.js
var Migrations = artifacts.require("./Migrations.sol");
/ /加入自定义合约
var demo = artifacts.require("./demo.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
//部署引入自定义合约
deployer.deploy(demo);
};
修改truffle.js配置,信息如截图所示:
networks: {
development: {
host: "localhost",
port: 7545,
network_id: "*"
}
}
编译、运行合约:
root@keke:~/truffle4-demo# truffle compile #此时会在./build目录下生成编译后的文件,格式为:*.json。
root@keke:~/truffle4-demo# truffle migrate #部署合约至开发客户端上
truffle migrate --reset来强制重编译并发布所有合约
控制台调用合约:
root@keke:~/truffle4-demo# truffle console
truffle(development)> Demo.deployed().then(function(instance){return instance.sayHi.call();});
'hello world'
NodeJS集成Truffle4
在NodeJS环境使用Truffle4合约,需要手动集成这Web3、truffle-contract两个模块。在集成前,我们需要创建工程的npm包管理环境,首先进入truffle4-demo工程目录,使用npm init来初始化工程的npm包管理环境:
root@keke:~/truffle4-demo# npm init #生成json配置文件
安装truffle-contract包(安装truffle-contract包时,会自动安装Web3,故无需再次安装web3包):
root@keke:~/truffle4-demo# npm install truffle-contract --save
编写Node.js调用合约代码,在项目根目录下创建testWeb3.js文件
//要在NodeJS中使用Truffle,我们要先引入web3
var Web3 = require('web3');
var contract = require("truffle-contract");
//http://localhost:7545地址为开发客户端地址
var provider = new Web3.providers.HttpProvider("http://localhost:7545");
//使用truffle-contract包的contract()方法
//请务必使用你自己编译的Demo.json文件内容
var Demo = contract(
**此处输入为./build/contracts/Demo.json文件中的内容**
);
Demo.setProvider(provider);
//没有默认地址,会报错
//UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): Error: invalid address
//务必设置为自己的钱包地址,如果不知道,可通过开发者客户端查看
Demo.defaults({
from : "0x396FE5d2FA697F62C2C2A8bb48811E87A72D3d03"
});
var instance;
Demo.deployed().then(function(instance){
return instance.sayHi.call();
}).then(function(result){
console.log(result);
});
运行合约:
root@keke:~/truffle4-demo# node testWeb3.js
'hello world'
以太坊(Ethereum)智能合约NodeJS/Web3 使用的更多相关文章
- 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发
智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...
- 零门槛,包教会。让你在5分钟内使用以太坊ERC20智能合约发行属于自己的空气币
前言 目前区块链是互联网中最最火的风口,没有之一.我周围的很多朋友也加入了“炒币”行列,但很不幸,几乎都被“割韭菜”了.而经过我的几天研究,发现,如果自己要发行一种空气币,简直太简单了.只需要下面几个 ...
- 以太坊solidity智能合约-生成随机数
Solidity随机数生成 在以太坊的只能合约中,没有提供像其他面向对象编程一样的生成随机数的工具类或方法.其实,所谓的随机数也是伪随机的,没有哪一种语言能够真正的生成随机数. 对于solidity来 ...
- 以太坊solidity智能合约语言学习资源整理
暂时看到篇文章写的不错,先收集下来,后面有机会自己也整理一个 Solidity语言学习(一)Solidity语言学习(二)——Solidity的安装与编译Solidity语言学习(三)——智能合约编程 ...
- 以太坊系列之十七: 使用web3进行合约部署调用以及监听
以太坊系列之十七: 使用web3进行智能合约的部署调用以及监听事件(Event) 上一篇介绍了使用golang进行智能合约的部署以及调用,但是使用go语言最大的一个问题是没法持续监听事件的发生. 比如 ...
- (转)以太坊(Ethereum)创世揭秘 以太坊(Ethereum)创世揭秘
什么是以太坊(Ethereum) 以太坊(Ethereum)是一个基于区块链技术,允许任何人构建和使用去中心化应用的区块链平台.像比特币一样,以太坊是开源的,并由来自全世界的支持者们共同维护.与比特币 ...
- (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
最近,一位小伙伴向我咨询问题,说他发现了一个诡异的现象.以太坊的区块链中居然有全是0的地址:0x0000000000000000000000000000000000000000 这究竟是怎么回事儿呢? ...
- 区块链入门到实战(23)之以太坊(Ethereum) – 虚拟机架构
以太坊(Ethereum)网络中,定义了一组通用协议用于支持智能合约的运行,其核心便是以太坊(Ethereum)虚拟机. 下图解释了该架构: 开发人员使用Solidity等开发语言开发智能合约 源程序 ...
- 区块链入门到实战(22)之以太坊(Ethereum) – 账号(地址)
作用: 外部账号 – 用户使用的账号,账户余额. 合约账号 – 智能合约使用的账号,每个智能合约都有一个账号,内存和账户余额 以太坊(Ethereum)网络中,有2种账号: 外部账号 – 用户使用的账 ...
随机推荐
- windows10 更新后要输入2次密码才能进入系统
解决办法: 设置---账户---登录选项---隐私---更新或重启后,使用我的登录信息自动完成设备设置.(关闭)
- join 关键字
参考:http://www.blogjava.net/vincent/archive/2008/08/23/223912.html
- POJ 2184 Cow Exhibition (带负值的01背包)
题意:给你N(N<=100)只牛,每只牛有一个智慧值Si和一个活泼值Fi,现在要从中找出一些来,使得这些牛智慧值总和S与活泼值总和F之和最大,且F和S均为正.Si和Fi范围在-1000到1000 ...
- 转载 c++指针 指针入门
这是一篇我所见过的关于指针的最好的入门级文章,它可使初学者在很短的时间内掌握复杂的指针操作.虽然,现在的Java.C#等语言已经取消了指针,但作为一个C++程序员,指针的直接操作内存,在数据操作方面有 ...
- ACM笔记
写给自己看,纯属打发时间... Sacnf的返回值是成功赋值的变量个数 for(int i=0; i<100; i++) 在C++标准中指出for循环条件中定义的变量,作用域仅限于循环内部 ...
- POJ 3414 Pot (输出路径)【BFS】
<题目链接> 题目大意: 有两个容量的空杯子,能够对这两个空杯子进行三种操作: 分别是fill(a),装满a杯子: drop(a),倒空a杯子: pour(a,b),将a杯子中的水倒入b杯 ...
- 条件随机场之CRF++源码详解-特征
我在学习条件随机场的时候经常有这样的疑问,crf预测当前节点label如何利用其他节点的信息.crf的训练样本与其他的分类器有什么不同.crf的公式中特征函数是什么以及这些特征函数是如何表示的.在这一 ...
- Oracle - Dbms Output window
Ensure that you have your Dbms Output window open through the view option in the menubar. Click on t ...
- ajax那些事儿
一.Ajax的定义浏览器与服务器之间,采用HTTP协议通信.用户在浏览器地址栏键入一个网址,或者通过网页表单向服务器提交内容,这时浏览器就会向服务器发出HTTP请求.Ajax全称Asynchronou ...
- 洛谷P1395 会议(CODEVS.3029.设置位置)(求树的重心)
To 洛谷.1395 会议 To CODEVS.3029 设置位置 题目描述 有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1.现在村长希望在某个村民家中召开一场会 ...