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

区块链技术巴比特2017-11-25 06:55:07  阅读 -评论 0

作者Jan声明:ethereum-bootstrap是我建立的一个github项目,目的是帮助刚接触以太坊的同学快速的搭建起自己的本地开发环境,体验智能合约的开发。阅读本文需要有基本的编程知识。项目地址: https://github.com/janx/ethereum-bootstrap

Ethereum Bootstrap

通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试。

仓库中包含的工具有:

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

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

准备 在本地安装好go-ethereum和solc, 可以执行geth和solc命令。如果操作系统是ubuntu, 安装官方的ethereum安装包即可。 将本仓库通过git clone命令下载到本地。 安装expect,工具脚本用它来自动化一些过程。例如在ubuntu上: sudo apt-get install expect 启动geth 进入本仓库目录: cd ethereum-bootstrap 导入测试账户私钥: ./bin/import_keys.sh 启动私有链节点: ./bin/private_blockchain.sh. 启动成功后可以看到类似如下输出: 以太坊本地私有链开发环境搭建 此时以太坊交互式控制台已经启动,我们可以开始测试和开发了。

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

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

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

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

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

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

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

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]; } }';

然后编译合约代码:

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, 和用于创建新合约的费用gas.gas是一个估计值,只要比所需要的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文档中文版。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&amp;mid=2650632639&amp;idx=1&amp;sn=e6d1c29731d992a80410aaee82ec3ea6&amp;chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-03-21
    排名用户贡献值
    1BitettFan23752
    2等待的宿命23696
    3六叶树20309
    4天下无双16192
    5区块大康15902
    6lizhen00214889
    7让时间淡忘14256
    8linjm122712327
    9冷风大q11188
    10momo11174
    返回顶部 ↑