本地搭建以太坊(Ethereum)详细教程

本篇教程旨在自己的电脑上安装配置以太坊开发环境,搭建以太坊私有链,编写一个简单的智能合约,通过以太坊JSON RPC和JavaScript API编程接口将其部署到所创建的以太坊私有链,并可调用合约获得正确的合约执行结果。

一、以太坊开发环境搭建

1.1 Mac OS X系统安装go环境
官网链接:https://golang.org/dl/
官网下载最新的稳定版本:go1.11.2.darwin-amd64.pkg,直接双击完成安装,安装目录在/usr/local/go/下。
配置环境变量:
vim ~/.bash_profile
export PATH=$PATH:/usr/local/go/bin
查看是否配置成功
go version
go version go1.11.2 darwin/amd64

1.2 安装Node.js、Npm
官网链接:https://nodejs.org/en/download/
查看是否安装成功
node -version或node –v
NPM是随同NodeJS一起安装的包管理工具。
npm -version或npm -v

1.3 以太坊Ethereum安装
apt install ethereum
查看以太坊是否安装成功
geth version

1.4 solc编辑器安装
npm install -g solc
查看solc支持的功能
solcjs --help
注意:solcjs命令与Solidity编译器提供的solc包并不兼容,因此不能通过eth.compile.solidity() RPC的方式与以太坊客户端结合使用。

二、以太坊集成开发环境

创建账户

geth account new

输入两遍密码后,生成账户地址。
本地搭建以太坊(Ethereum)详细教程_第1张图片
以太坊账户地址 528301230cb94d1649534b13e991be243780d3bd

查看账户

geth account list

本地搭建以太坊(Ethereum)详细教程_第2张图片
初始化创世块文件

geth --datadir "./" init genesis.json

本地搭建以太坊(Ethereum)详细教程_第3张图片
注意:"./"表示以太坊的路径。

运行以太坊私有链,首先要定义自己的创世区块,创世区块信息写在一个 JSON 格式的配置文件中,即genesis.json。

其中,chainID指定了独立的区块链网络ID。网络ID在连接到其他节点的时候会用到,以太坊公网的网络ID是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络ID。不同ID网络的节点无法相互连接。配置文件还对当前挖矿难度difficulty、区块Gas消耗限制gasLimit等参数进行了设置。

启动以太坊

geth --datadir "./" console

本地搭建以太坊(Ethereum)详细教程_第4张图片
启动挖矿

miner.start()

本地搭建以太坊(Ethereum)详细教程_第5张图片
其中start可以设置参数,表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,等进度达到100%后,就会开始挖矿。

停止挖矿

miner.stop()

本地搭建以太坊(Ethereum)详细教程_第6张图片
挖矿所得的奖励会进入矿工的账户,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户,可以通过miner.setEtherbase()将其他账户设置成coinbase。另外注意第一次停止挖矿需要一段时间,因为节点需要为工作证明算法生成1GB数据集。

三、以太坊编程接口

3.1 通过json rpc编译合约

curl --data '{"jsonrpc":"2.0","method": "eth_compileSolidity", "params": ["contract Multiply7 {event Print(uint);function multiply(uint input) returns (uint) {Print(input * 7);return input * 7;}}"], "id": 5}' localhost:8545

本地搭建以太坊(Ethereum)详细教程_第7张图片
提示 port 8545: Connection refused

开启rpc端口

geth --datadir "./" --rpcport "8545" --rpc console

本地搭建以太坊(Ethereum)详细教程_第8张图片
开启8545端口后执行编译指令

curl --data '{"jsonrpc":"2.0","method": "eth_compileSolidity", "params": ["contract Multiply7 {event Print(uint);function multiply(uint input) returns (uint) {Print(input * 7);return input * 7;}}"], "id": 5}' localhost:8545

本地搭建以太坊(Ethereum)详细教程_第9张图片
提示 only application/json is supported

添加头部后执行编译指令

curl -H "Content-Type: application/json"  --data '{"jsonrpc":"2.0","method": "eth_compileSolidity", "params": ["contract Multiply7 {event Print(uint);function multiply(uint input) returns (uint) {Print(input * 7);return input * 7;}}"], "id": 5}' localhost:8545

本地搭建以太坊(Ethereum)详细教程_第10张图片
提示 eth_compileSolidity is not available

新版本中已不能通过json rpc部署合约,官方推荐用Remix进行合约的部署任务。

3.2 通过JavaScript API编译合约

定义合约

var source = 'contract Multiply7 {event Print(uint);function multiply(uint input)
returns (uint) {Print(input * 7);return input * 7;}}'

本地搭建以太坊(Ethereum)详细教程_第11张图片
编译合约

var compiled = web3.eth.compile.solidity(source)

本地搭建以太坊(Ethereum)详细教程_第12张图片
提示 eth_compileSolidity is not available

3.3 通过在线Remix web3编译合约
本地搭建以太坊(Ethereum)详细教程_第13张图片

var multiply7Contract = web3.eth.contract([{"constant":false,"inputs":[{"name":"input","type":"uint256"}],"name":"multiply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"Print","type":"event"}]);
var multiply7 = multiply7Contract.new(
   {
     from: web3.eth.accounts[0], 
     data: '0x608060405234801561001057600080fd5b5060f58061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b348015604f57600080fd5b50606c600480360381019080803590602001909291905050506082565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a723058201d5375a8266e2b7567b08952c4bc14f1536831ea67d18c9f6046297b3540f53b0029', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

合约部署
本地搭建以太坊(Ethereum)详细教程_第14张图片

合约地址
本地搭建以太坊(Ethereum)详细教程_第15张图片

INFO [10-15|16:24:29.097] Submitted contract creation              fullhash=0x281bc3c1169db4a96172c7c6a73e2642f31fe4195934a97bf4a0416acc2cfcfa contract=0xb7bdeBf286e03793382f3F1Bd4E8Fd32D99D9377
null [object Object]

查看multiply7合约

multiply7

本地搭建以太坊(Ethereum)详细教程_第16张图片
调用call()测试合约函数结果

multiply7.multiply.call(uint);

本地搭建以太坊(Ethereum)详细教程_第17张图片
发起交易之前解锁账户

personal.unlockAccount(eth.coinbase)

本地搭建以太坊(Ethereum)详细教程_第18张图片
发起交易

multiply7.multiply.sendTransaction(7,{from:eth.accounts[0],gas:200000})

本地搭建以太坊(Ethereum)详细教程_第19张图片
获取交易hash 0x831354bf01a9a2033701b17537915b71273420005a43372053ffa8e37f4dd4e9

查看交易

eth.getTransaction("0x831354bf01a9a2033701b17537915b71273420005a43372053ffa8e37f4dd4e9")

本地搭建以太坊(Ethereum)详细教程_第20张图片
3.4 通过在线Remix编译部署合约

本地私有链监听的RPC端口
本地搭建以太坊(Ethereum)详细教程_第21张图片
OK提示 is open (via IPC or RPC)
本地搭建以太坊(Ethereum)详细教程_第22张图片
以web方式连接私有链,必须开启–rpccorsdomain参数
设置IP请求白名单 * 为所有

geth --datadir "./" --rpcport "8545" --rpccorsdomain "*" --rpc console

本地搭建以太坊(Ethereum)详细教程_第23张图片
成功后读取Account列表
本地搭建以太坊(Ethereum)详细教程_第24张图片
部署信息
本地搭建以太坊(Ethereum)详细教程_第25张图片
控制台查看合约部署的合约地址
本地搭建以太坊(Ethereum)详细教程_第26张图片
发起交易

curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0", "method": "eth_sendTransaction", "params":[{"from":"0x528301230cb94d1649534b13e991be243780d3bd", "to":"0x1269e13d9df9f64b9cbf0bdfaf0dcb0e67f4cf06", "data":"0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' localhost:8545

本地搭建以太坊(Ethereum)详细教程_第27张图片
交易提交
本地搭建以太坊(Ethereum)详细教程_第28张图片
查看交易

eth.getTransaction("0x596477fd2d977bc67d5bea5e5146d95fff2fd141a04085e42ae34e9d3ca60759")

本地搭建以太坊(Ethereum)详细教程_第29张图片

你可能感兴趣的:(区块链)