以太坊本地私有链开发环境搭建

Ethereum Bootstrap

经过本文所述方法和项目中的脚本,咱们能够快速的搭建好本身的私链进行开发测试。javascript

仓库中包含的工具备:java

  • 一个测试帐户导入脚本,在首次部署时将五个测试帐户私钥导入以太坊节点。
  • 一个genesis.json配置文件,为对应的五个测试帐户提供初始资金(以太币),方便开发测试。
  • 一个快速启动私有链节点并进入交互模式的脚本。
  • 一个合约样例:contracts/Token.sol。这是一个使用合约语言Solidity编写的智能合约。Token合约的功能是发行一种token(能够理解为货币,积分等等),只有合约的建立者有发行权,token的拥有者有使用权,而且能够自由转帐。

测试帐户私钥是放在Github上的公开数据,千万不要用于正式环境中或者公有链上。若是在测试环境以外的地方使用这些私钥,你的资金将会被窃取!git

准备

  1. 在本地安装好go-ethereumsolc, 能够执行gethsolc命令。若是操做系统是ubuntu, 安装官方的ethereum安装包便可。
  2. 将本仓库经过git clone命令下载到本地。
  3. 安装expect,工具脚本用它来自动化一些过程。例如在ubuntu上: sudo apt-get install expect

启动geth

  1. 进入本仓库目录: cd ethereum-bootstrap
  2. 导入测试帐户私钥: ./bin/import_keys.sh
  3. 启动私有链节点: ./bin/private_blockchain.sh. 启动成功后能够看到相似以下输出: 
  4. 此时以太坊交互式控制台已经启动,咱们能够开始测试和开发了。

注意:工具脚本假设你的geth安装在默认位置, 能够直接经过geth执行。若是geth命令安装在非标准的位置,能够设置GETH环境变量指定geth可执行文件的路径。例如:github

GETH=/some/weird/dir/geth ./bin/import_keys.shweb

使用以太坊控制台编译和部署智能合约

contracts目录下有一个智能合约样例文件Token.sol, 经过Solidity语言实现了基本的代币功能, 合约持有者能够发行代币, 使用者能够互相转帐.json

咱们可使用以太坊控制台来编译部署这个合约.以太坊控制台是最基本的工具,使用会比较繁琐.社区也提供了其余更加方便的部署工具,此处不作讨论.bootstrap

第一步,咱们先把合约代码压缩为一行.新建一个ssh session, 切换到geth用户环境su - geth, 而后输入:cat contracts/Token.sol | tr '\n' ' '.ubuntu

切换到以太坊控制台,把合约代码保存为一个变量:网络

var tokenSource = 'contract Token {     address issuer;     mapping (address => uint) balances;      event Issue(address account, uint amount);     event Transfer(address from, address to, uint amount);      function Token() {         issuer = msg.sender;     }      function issue(address account, uint amount) {         if (msg.sender != issuer) throw;         balances[account] += amount;     }      function transfer(address to, uint amount) {         if (balances[msg.sender] < amount) throw;          balances[msg.sender] -= amount;         balances[to] += amount;          Transfer(msg.sender, to, amount);     }      function getBalance(address account) constant returns (uint) {         return balances[account];     } }';

而后编译合约代码:session

var tokenCompiled = web3.eth.compile.solidity(tokenSource);

经过tokenCompiled.Token.code能够看到编译好的二进制代码,经过tokenCompiled.Token.info.abiDefinition能够看到合约的ABI

接下来咱们要把编译好的合约部署到网络上去.

首先咱们用ABI来建立一个javascript环境中的合约对象:

var contract = web3.eth.contract(tokenCompiled.Token.info.abiDefinition);

咱们经过合约对象来部署合约:

var initializer = {from: web3.eth.accounts[0], data: tokenCompiled.Token.code, gas: 300000};

var callback = function(e, contract){
    if(!e) {
      if(!contract.address) {
        console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined...");
      } else {
        console.log("Contract mined!");
        console.log(contract);
      }
    }
};

var token = contract.new(initializer, callback);

contract.new方法的第一个参数设置了这个新合约的建立者地址from, 这个新合约的代码data, 和用于建立新合约的费用gasgas是一个估计值,只要比所须要的gas多就能够,合约建立完成后剩下的gas会退还给合约建立者.

contract.new方法的第二个参数设置了一个回调函数,能够告诉咱们部署是否成功.

contract.new执行时会提示输入钱包密码.执行成功后,咱们的合约Token就已经广播到网络上了.此时只要等待矿工把咱们的合约打包保存到以太坊区块链上,部署就完成了.

在公有链上,矿工打包平均须要15秒,在私有链上,咱们须要本身来作这件事情.首先开启挖矿:

miner.start(1)

此时须要等待一段时间,以太坊节点会生成挖矿必须的数据,这些数据都会放到内存里面.在数据生成好以后,挖矿就会开始,稍后就能在控制台输出中看到相似:

:hammer:Mined block

的信息,这说明挖到了一个块,合约已经部署到以太坊网络上了!此时咱们能够把挖矿关闭:

miner.stop(1)

接下来咱们就能够调用合约了.先经过token.address得到合约部署到的地址, 之后新建合约对象时可使用.这里咱们直接使用原来的contract对象:

// 本地钱包的第一个地址所持有的token数量
> token.getBalance(web3.eth.accounts[0])
0

// 发行100个token给本地钱包的第一个地址
> token.issue.sendTransaction(web3.eth.accounts[0], 100, {from: web3.eth.accounts[0]});
I1221 11:48:30.512296   11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef"

// 发行token是一个transaction, 所以须要挖矿使之生效
> miner.start(1)
:hammer:Mined block
> miner.stop(1)

// 再次查询本地钱包第一个地址的token数量
> token.getBalance(web3.eth.accounts[0])
100

// 从第一个地址转30个token给本地钱包的第二个地址
> token.transfer.sendTransaction(web3.eth.accounts[1], 30, {from: web3.eth.accounts[0]})
I1221 11:53:31.852541   11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b"
> miner.start(1)
> miner.stop(2)
> token.getBalance(web3.eth.accounts[0])
70
> token.getBalance(web3.eth.accounts[1])
30

其余

私有链的全部数据都会放在仓库根目录下的data目录中,删除这个目录能够清除全部数据,从新启动新环境。

作完这些以后你应该对在以太坊私有链上进行开发有了一个大概的了解吧,若是还想学习更多知识,一能够看一看上面执行的脚本代码,到底干了些什么,用了哪些命令行参数,二能够阅读正在ethfans上更新的solidity文档中文版

相关文章
相关标签/搜索