步骤
1. node.js开发环境 https://nodejs.org/zh-cn/下载安装
2. 开发环境,remix http://remix.ethereum.org/ (暂时不用,可以先跳过)
安装本地remix环境
remix:Windows、Mac OS X和Linux。
remix
git clone https://github.com/ethereum/browser-solidity
cd browser-solidity
npm install
npm start
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
3. 编写智能合约
在E:\work_document\blockchain\solidity\calc下创建Calc.sol文件,编写如下智能合约
pragma solidity ^0.4.0;
contract Calc
{
function add(uint a, uint b) returns(uint)
{
return a + b;
}
}
4. 安装Solidity编译器
在命令行输入 npm install –g solc
查看版本:solcjs --version
5. 编译Solidity程序
重新打开cmd命令行到Calc.sol目录下执行 solcjs --abi --bin Calc.sol
生成两个文件:
Calc_sol_Calc.abi:接口文件
Calc_sol_Calc.bin:以太坊运行的二进制文件(EVM字节码)
6. testrpc安装
testrpc是在本地使用内存模拟的一个以太坊环境
npm install -g ethereumjs-testrpc
ps:简介truffle和testrpc
(truffle是本地的用来编译、部署智能合约的工具。testrpc不同于geth,geth是真正的以太坊环境,testrpc是在本地使用内存模拟的一个以太坊环境,对于开发调试来说,更为方便快捷,当合约在testrpc中测试通过后,再部署到geth中去。所以可以说truffle和testrpc就是两大杀器。)
7. 启动testrpc
重新打开cmd命令行执行 testrpc
默认端口号:8545,
testrpc会自动生成10个用于测试的address和10个private key。
8. 安装web3.js
【web3.js与合约交互】
web3.js是以太坊提供的一个Javascript库,它封装了以太坊的JSON RPC API,提供了一系列与区块链交互的Javascript对象和函数,包括查看网络状态,查看本地账户、查看交易和区块、发送交易、编译/部署智能合约、调用智能合约等,其中最重要的就是与智能合约交互的API。
npm install
[email protected]
9. 初始化(web3.js)
var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
eth = web3.eth
10. 装载abi和bin文件
abi = JSON.parse(fs.readFileSync('E:\\work_document\\blockchain\\solidity\\calc\\Calc_sol_Calc.abi').toString())
code = fs.readFileSync('E:\\work_document\\blockchain\\solidity\\calc\\Calc_sol_Calc.bin').toString()
11. 发布智能合约
contract = eth.contract(abi)
deployed = contract.new({from:eth.accounts[0],data:code,gas:470000})
//eth.accounts[0] 发布智能合约的账户,使用的是testrpc提供的默认账户第一个。
//data 发布的二进制文件
//gas 发布智能合约最大的成本上线,尽量大一些 发布智能合约必须要付出一定的费用
deployed.address //智能合约的地址
12. 通过web3.js调用智能合约
contract1 = eth.contract(abi)
instance = contract1.at(deployed.address)
instance.add.call(1,2) // 本地调用
如下图可看到执行结果两者之和。