以太坊本地私有链开发环境搭建
以太坊本地私有链开发环境搭建!通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试。
仓库中包含的工具有:
一个测试账户导入脚本,在首次部署时将五个测试账户私钥导入以太坊节点。
一个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文档中文版。
1 安装前的准备
1.1 配置Linux系统
本文配置的为windows下的VMware软件下搭建的Linux下的cent0S-7系统,推荐系统有CentOS 7和Ubuntu 16.04有条件的可以用云服务器上的Linux系统,好处是可以搭建广域网联盟链。
本文默认你已经对以太坊和docker技术有一定的掌握和了解,并部署好相应的环境。如果你还未准备好,请参考芯链公众号前期发布的环境搭建和部署文章。
1.2 安装Docker
请使用管理员权限进行安装,
# su root
安装Docker(请参考芯链公众号发布的安装指导文章):
CentOS: yum -y install docker-io
Ubuntu: apt-get install docker-engine
安装完毕如图:
然后启动Docker服务:
#service docker start
校验docker是否安装成功:
#docker run hello-world
这个命令会下载一个测试镜像,并且运行在一个容器中。当容器运行时,他会打印一些信息,并且退出。下图表示Docker已经安装完成。
2 安装bootnode
2.1 下载bootnode镜像
运行命令如下命令:
#docker pull docker.io/hawyasunaga/ethereum-bootnode
查看镜像:docker images
2.2 Docker创建bootnode容器节点
生成引导节点:
运行引导节点:
注意:这两个命令参数中,-v /path/docker/bootnode:/root/bootnode为映射路径,在docker的这个bootnode容器中,出现容器内/root/bootnode路径都映射为外部路径/path/docker/bootnode。下方以太坊容器搭建节点命令同理。
2.3 查看bootnode日志得到节点
得到节点如下:
将[::]替换为本机IP地址
好了,用于连接的根节点运行完毕。
3 安装以太坊节点
可以找台Linux进行节点联盟链的搭建了,这里继续以centos7继续演示了。
3.1 创建以太坊的创世文件
新建创世文件genesis.json,内容如下:
3.2 初始化创世文件
首先新建一个准备放置以太坊目录的文件,将genesis.json文件放入该地址,本文为/home/admin下:
运行如下命令
请记住—networkid 8765639736937780.这是当前搭建联盟链的ID。
查看日志文件:docker logs -f gethDev1
初始化成功。
3.3 Docker创建以太坊容器节点
运行如下命令
//enode为上面运行bootnode得到的节点,并将预备的私钥文件放入keystore中,并且—networkid 8765639736937780为联盟链的标识ID。
查看控制台日志:docker logs -f gethDev1
Ok,节点搭建成功。
3.4 验证联盟链的连接
在上一步搭建好节点后,等待一段时间,让节点自动连接根节点bootnode。
进入以太坊容器中:
输入命令:admin
查看peer是否连接:
OK,连接完成,联盟链搭建完成。
连接完成后,开始同步区块:
注意:这里连接的是之前已经加入bootnode根节点的其他节点,与根节点的连接并不会显示在peers中。如果是第一个连接bootnode的节点,连接了bootnode的时候输入admin,peers是空的,需要继续搭建一个节点来测试他们互相连接。
汪晓明
HPB芯链创始人,专栏作家。十余年金融大数据、区块链技术开发经验,曾参与创建银联大数据。主创区块链教学视频节目《明说》30多期,编写了《以太坊官网文档中文版》,并作为主要作者编写了《区块链开发指南》,在中国区块链社区以ID“蓝莲花”知名。
数字货币钱包系统搭建多币种虚拟币钱包开发怎么做?区块链钱包用来存储数字资产,但数字资产是基于区块链,是一个特殊的账本,因此区块链钱包里并不装数字资产,装的是数字资产的密钥,有了密钥就可以拥有相应地址上的数字资产的支配权。
钱包基础功能介绍
存储和转账是区块链钱包的基础服务。存入和转出的交易记录保存在区块链钱包里,用户可以在相应的区块链浏览器上查询到对应的信息,以确认交易是否完成。
钱包地址:每一款区块链钱包均支持单条或多条区块链的数字资产。
存储:单个地址仅支持该条区块链上的单种资产;同一区块链上的主链资产和协议Token资产是按不同钱包地址存放。
转账:用户从区块链钱包地址往外转账时,只能向相同资产类型的区块链钱包地址转账,即BTC钱包地址只能向BTC钱包地址转账;ETH钱包地址只能向ETH钱包地址转账,而不能向ETH ERC20的钱包地址转账。
交易确认:当前部分区块链钱包开设有转账确认功能,能提醒用户转账操作是否成功。
多币种钱包系统发展至今为了更好的增强用户的粘性,往往会在其原本的基础上开展相应的附加功能来把握客户。
1.数字资产交易行情:当前提供数字资产交易行情服务的区块链钱包占比约为60%。
2.数字资产兑换交易:区块链钱包内能够兑换交易的数字资产种类,取决于对接的交易平台和该钱包支持的数字资产数量。
3.数字资产理财:数字资产理财服务是建立在兑换交易基础上的增值服务。用户将数字资产托管给钱包运营商或第三方,由其代为运营管理以获取更丰厚的利润,但同时也承担着较高风险。
4.区块链行业资讯:区块链钱包提供行业资讯主要是为用户提供交易参考,帮助用户判断区块链和数字资产的未来走势。
5.等等
区块链项目系统开发商
区块链技术开发公司深圳源中瑞科技(区块链项目系统开发商),拥有多年开发经验,2012年开始研究区块链技术,有近200技术人员,我们的理念是诚信为本,服务至上,期待与您合作!
韩国最大的电信公司KT刚刚宣布为该国最大的城市之一釜山市推出一种基于区块链的本地货币,据报道,该货币将于12月30日启用。
来源:Pixabay
当地新闻媒体dongA在12月19日报道:“Dongbaekjeon是釜山市发行的一种基于区块链的卡式本地货币,旨在振兴釜山的当地经济并减轻小企业的管理负担。”
媒体报道了多种获取这种货币的方法,包括Dongbaekjeon移动应用,一家名为Hana的银行和釜山银行(Busan Bank)。
文章还指出,参与者可以“在釜山的任何具有信用卡终端的商店使用这种货币”,尽管这种货币的兼容性在大型零售商中不那么普遍,但主要是鼓励在小型本地企业的消费。
据媒体报道此前详细报道,釜山政府于今年2月初与电信公司KT签署了一项协议,内容是建设以区块链为基础的资产,以助推这座韩国第二大城市。