6.2 以太坊应用 - 数据结构 - 机器学习
数据结构 - 机器学习
深度学习

当前位置:首页 » 区块链精品文章 » 正文
6.2 以太坊应用
1228 人参与 2018年08月24日 09:06 分类 : 区块链精品文章 评论
6.2.1 测试链与私链
以太坊属于公有链,官方不但提供了主链,也提供了测试链,然而对于想要更进一步理解以太坊结构的读者,就有些不方便了,如果是在主链上进行操作使用,则有如下一些问题:
1)以太坊上的转账交易或者智能合约部署等都需要消耗以太币,显然不适合开发测试的需求;
2)以太坊公链的运行节点遍布全球,即便是使用测试链,运行速度也是无法达到实验级的要求的,而且不方便去控制网络中的每一个节点;
3)对于公链的使用,只是通过客户端直接去连接使用,但看不到网络具体是怎么搭建起来的,很多细节看不到;
4)若在某些场合下只是希望使用以太坊来搭建一个局部的网络,类似于局域网,那肯定不能直接使用公链。
基于以上原因,我们有必要自己搭建一个测试链,由于这个测试链通常运行在用户自己的局域网络中,一般情况下并不会 开放到公网中,因此这种测试链也称为私有链,在本节,我们就来演示一下如何使用以太坊客户端搭建私有链,下面的过程是在Mac OS上完成的,若在Linux或者Windows上操作,过程都是一样的。
工欲善其事,必先利其器,要搭建私有链,自然先要准备好工具,准备材料如下:
1)以太坊核心客户端可以到官网下载,我们使用官方推荐的Go语言版本geth,下载版本为1.6.5,为了操作方便,可以将geth放到系统的环境变量目录下。注意,由于是Go语言版本,因此务必保证本机已经安装了Go的运行环境;
2)创建一个配置私有链的数据目录,我们命名为ethprivate;
3)准备一份创世区块的初始化文件,我们命名为genesis.json,放到ethprivate目录中,其内容如下:
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200000000",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
可以看到,主要配置了初始的难度值以及两个初始的钱包地址及其余额,这些值大家可以根据自己的需要自行设置。这里需要注意,如果使用的geth客户端版本不是1.6.x而是1.5.x(如1.5.9),则配置文件中不能有config段,否则会出错。
接下来创建私有链了,创建的过程相当简单,进入到ethprivate目录中,执行如下命令:
geth --datadir "./" init genesis.json
命令中,通过datadir参数指定了数据目录,这里指定的是当前所在的目录也就是ethprivate目录,执 行完命令后,可以在ethprivate目录下看到生成了两个子目录:一个是geth;一个是keystore。创建完毕后,我们就可以启动这个私有链 了,命令如下:
geth --datadir "./" --networkid 989898 --rpc console --port 0
可以看到这里指定了networkid,并且开启了rpc服务,当然参数还不止这些,更多的参数应用可以查看geth命令的使用帮助。如果要指定端口,可以如下执行启动命令:
geth --datadir "./" --networkid 989898 --rpc console --port 30304 --rpcport 8546
启动成功后默认会进入到命令控制台,可以通过命令与私有链节点进行访问,我们可以通过 admin.nodeInfo命令查看节点摘要信息。注意,我们现在只是启动了一个节点,如果还需要启动第二个节点,步骤跟上述一样,另外创建一个新文件 夹,将genesis.json复制到目录中,然后同样运行初始化,以及启动节点命令即可,需要注意的是,要指定不同的端口,否则可能会导致端口占用冲 突。若创建多个节点,则节点之间可以通过admin.addPeer连接,在本机启动多个节点或者在不同的计算机上运行多个节点都可以,这样可以模拟出一 个私有链网络。
在节点启动后的控制台中,可以进行各种操作,实际上就是调用以太坊节点的RPC服务,比如新建一个账户地址,可以使用如下命令:
personal.newAccount
创建账号后,就可以启动挖矿了,挖矿命令如下:
//启动挖矿
miner.start()
//停止挖矿
miner.stop()
一定要注意,如果希望某个节点上的操作数据要写入到区块,并且同步到网络中的其他节点,必须要启动挖矿,挖矿就是一个区块打包和传播同步的过程,同时也只有启动挖矿,才能让私有链中的主账号获得以太币,进而可以用来继续测试转账交易、合约部署、合约调用等功能。
有读者可能会觉得这种配置私有链的方式还是有些麻烦。对于想快速方便进行测试使用以及智能合约开发的读者,还有一 种配置私有链的方式,那就是使用TestRPC与Truffle组合。TestRPC是在本地使用内存模拟的一个以太坊环境,可以用于搭建测试环境,基于 Node.js开发,因此使用TestRPC首先要安装Node.js环境并且版本要大于6.9.1。Truffle是针对以太坊智能合约应用的一套开发 框架。我们来看下具体如何搭建。
1)使用npm安装TestRPC,命令如下:
sudo npm install -g ethereumjs-testrpc
2)安装完毕后,可以输入如下命令查看版本信息:
testrpc –version
3)运行后输出如下信息:
EthereumJS TestRPC v3.0.5
Available Accounts
==================
(0) 0xb43333d44136f351fd30d20215490432e0f3968d
(1) 0x34f73354540fa4b653bf33568c7ba9f69ad6c84d
(2) 0x047bf66a5be28bb84502f3baaa40b10cb04d44e8
(3) 0x1dc4d3ce33b05e24219f93f28612b9a80e2724de
(4) 0xaa82bb04532d560139eeae495fc6d00706dbc7f7
(5) 0xe2ee5d9e955277b6f5e13d10beb686e069859731
(6) 0xfe023592bc7bbb7dac6051950a0b8774206c1f5b
(7) 0x34b1b1b6a36348912be0b943e3f34db38339a192
(8) 0x860638afa0bbecf8ea5c5808e95108710ec92acc
(9) 0xd7a701bd9cffbf887b1e3f03ac91c68ead3032ec
Private Keys
==================
(0) 6e94ed2e32818d2bb1d58bd0119407096691ec683ed8a43a2975ff6003bb1924
(1) ccc8fca886b7666c0e2707cc9a429d4a1c941dd170b8c0f5f55c71ce966fa835
(2) d0ba307ed8ff2ec12deeb59d0c85884d74735b8ab26329e74cb37966f656634b
(3) c057235669dd341ebb4ce1185b469eeac3d1cd2f763e95aa36e0e22adaa9ce84
(4) 7c6d6a7268fd9f76d2868f650168ba67a2901d427de85357b6a453dfad784db4
(5) 2baaacc4818dfc605b0c91ba5418826a86c09b375861123aa393d7411cce6595
(6) 147d63765df501f94179514459660502b00692b4aab0dfcc2316aea9fc0877dd
(7) bbded13290bcefc551d1cc9bf36921a2e65024b03401014388a6ce52c2159494
(8) 53df9b7d172746d9a0a548f62bc1d21ca78bd6202456221241b36a7fa1cf3b91
(9) 03691c7d31ce9b041d2a66bdc48397b13660f097164d443e3f8ba3f09ae9272e
HD Wallet
==================
Mnemonic: trade target identify fun bleak wish sphere emotion journey rose decide above
Base HD Path: m/44’/60’/0’/0/{account_index}
Listening on localhost:8545
可以看到,默认就自动配置了10个账户地址。注意,以上信息是动态的,每次启动时随机生成,不是固定的。通过最后一行数据的提示,表明TestRPC启动后使用8545端口监听。
4)同样使用npm安装Truffle,命令如下:
sudo npm install –g truffle
5)安装成功后,输入truffle--version,输出如下:
可以看到,输出了版本信息v3.2.5,并且在下面列出了各种可以使用的命令。
6)安装solc:
sudo npm install -g solc
注意,安装后的命令是solcjs,这是用来编译智能合约代码的。
7)运行测试
首先运行TestRPC,在命令行中直接通过testrpc命令可以启动,接着开始初始化Truffle目录,命令如下:
mkdir mytruffle && cd mytruffle
truffle init webpack
这个命令其实就是下载一个项目框架,也可以直接通过网址https://github.com/trufflesuite/truffle-init-webpack下载压缩包后解压缩,复制到相应目录,效果是一样的。初始化命令运行后,输出如下信息:
提示信息很简单,就是下载项目框架后进行初始化,初始化完成后,在目录中生成了如下文件:
其中,contracts中存放的是合约,truffle compile进行编译的时候就会在这里面寻找合约文件,migrations目录里面存放的是JavaScript文件,它帮助部署合约到以太坊网络 中,它们表示了进行部署任务的步骤,truffle.js文件内容如下:
module.exports = {
networks: {
development: {
host: "localhost", //节点地址,如果是私有链,一般是本机
port: 8545, //节点RPC端口
network_id: "*" //自定义网络号
}
}
};
默认的配置与testrpc的参数是一致的,也可以根据需要修改。
8)启动了testrpc,也初始化了truffle,现在开始试着编写合约。可以看到在contracts中已经有几个示例合约了,不用管,创建一个MyCalc.sol,源码如下:
pragma solidity ^0.4.11;
contract MyCalc {
function SumAdd(uint a) returns(uint d) {
return a + 100;
}
}
这是一段非常简单的代码,合约名为MyCalc,其中包含了一个方法SumAdd,通过传入一个整数参数,返回一 个加上100的值,这就是一份智能合约,智能合约并没有我们想象得那么复杂,与传统应用软件开发最大的区别就是,编写的合约一旦部署到以太坊上,就会被同 步到每一个节点中,由整个以太坊网络的基础设施来确保合约的刚性执行以及不可篡改性。我们先来看下这份编写的合约如何部署执行,代码编写完毕后就可以进行 编译了,以太坊中的智能合约都运行在EVM(Ethereum Virtual Machine,以太坊虚拟机)上,必须首先被编译为EVM能识别的字节码。
9)回到mytruffle的目录中,进行编译,执行如下命令:
sudo truffle compile
10)编译若没有问题,则会有如下提示:
Compiling ./contracts/MyCalc.sol...
Writing artifacts to ./build/contracts
11)可以看到生成了一个build目录,编译没有问题就可以部署了,进入到migrations目录,编辑“2_deploy_contracts”文件,在最后一行插入“deployer.deploy”(合约名),编辑内容如下:
var ConvertLib = artifacts.require("./ConvertLib.sol");
var MetaCoin = artifacts.require("./MetaCoin.sol");
var MyCalc=artifacts.require("./MyCalc.sol"); //新增
module.exports = function(deployer) {
deployer.deploy(ConvertLib);
deployer.link(ConvertLib, MetaCoin);
deployer.deploy(MetaCoin);
deployer.deploy(MyCalc); //新增
};
12)编辑保存后,执行部署命令:
sudo truffle migrate
13)注意,在操作过程中一定要保证TestRPC是开启的,命令执行成功后,在TestRPC中可以看到响应,接下来调用一下合约中的方法,要调用合约的功能,得与TestRPC模拟节点交互,首先进入到控制台,命令如下:
sudo truffle console
14)进入到控制台后,我们进入到MyTruffle目录下的build子目录中,找到MyCalc.json,打开它找到abi的内容段,复制出来,然后回到控制台,执行如下命令:
abi=复制出来的abi内容
15)同时在MyCalc.json中找到合约的地址,并且在控制台中执行命令:
myContract=web3.eth.contract(abi).at("0xc7b8a297b99e473feeaf447993600336482c8a8a")
16)接下来就可以执行合约中的函数了,执行如下命令:
myContract.SumAdd.call(10)
最后就能看到结果了。
至此,我们对以太坊的私有链配置以及开发测试环境的搭建介绍就结束了,大家可以根据自己的具体需求进行各项参数的 配置,另外也要注意版本变更带来的一些问题,比如geth的不同版本之间会有些差异,例如1.6版本去除了内置的JavaScript环境编译功能,而 1.5版本中是有的,因此在1.5版本中可以直接使用相关的合约编程和编译功能。以太坊是一个开源系统,功能开发也一直处于不断的进化中,随着发展,也会 出现更方便的功能,大家在具体使用过程中可以多关注一下。
6.2.2 编写一个代币合约
在上面几节中,我们演示了一段合约代码的编写,不过只是一个简单的加法运算,实在让人感觉不到智能合约的特色。在本小节中,我们来演示一下如何通过以太坊智能合约来创建一个数字代币,我们参照以太坊官网的示例,提供一段最简单的代币合约示例,代码如下:
pragma solidity ^0.4.11; contract MyToken { //声明数组,用以存储代币所有人的地址列表 mapping (address => uint256) public balanceOf; // 初始化代币总额,赋值给合约创建者的账户地址中 // 这是一个构造函数,只会被执行一次 function MyToken( uint256 initialSupply ) { balanceOf[msg.sender] = initialSupply; } /* 代币发送 */ function transfer(address _to, uint256 _value) { require(balanceOf[msg.sender] >= _value); // 检查余额是否足够 // 检查是否会溢出,主要防止循环发送给自己 require(balanceOf[_to] + _value >= balanceOf[_to]); balanceOf[msg.sender] -= _value; // 从发送者账户中减掉发送的金额 balanceOf[_to] += _value; // 在接收者账户中增加发送的金额 } }
通过上述代码的注释说明,我们大致了解了本合约代码中定义了一个名字叫MyToken的代币,提供了一个构造函数 初始化代币数量,构造函数中的msg.sender是指当前调用者的以太坊账户地址,由于合约一般都是由创建者部署的,因此初始化的代币会通过执行构造函 数一次性全部记录在创建者的账户地址中。除了构造函数,本合约还提供了一个发送的方法,用来进行代币转账,逻辑很简单,参数中包含了一个转账目标账户地址 的参数_to和一个转账金额参数_value,过程就是做一些基本校验以及更改转出和转入账户的金额,我们通过以太坊官方钱包来部署,为了方便操作,我们 使用较新的0.9.0版,其自带的geth是1.6.5版,并且支持直接配置为本机单节点私有链,我们来看一下操作步骤。
(1)配置为单节点私有链
可以看到,配置相当简单,选择“Solo network”即可,选择后可以创建一个账户,然后点击“开启挖矿(仅限Testnet)网络”,可以看到创建的账户中很快就能获得以太币,如下所示:
由于部署合约以及调用合约方法要消耗以太币,因此读者可以根据自己的需要确保账户中具备足够的余额。
(2)代币合约部署
通过下面第一个界面,可以部署合约以及查看合约。
我们看到在界面底部,有一个WATCH TOKEN按钮,这是专门用来查看代币合约的,大家注意,代币合约和基于以太坊的其他合约(如众筹合约等)性质都是一样的,只是代码逻辑不同,官方钱包在 这里专门为代币合约设置了一个查看的操作,是由于代币合约的特殊性,方便操作而已。
现在我们来部署代币合约,在合约界面点击DEPLOY NEW CONTRACT,进入到部署界面,如下面第二个界面。
在这个界面中,我们把编写的代币合约代码复制到SOLIDITY CONTRACT SOURCE CODE中,代码粘贴进去后,会自动进行编译,并将编译后的字节码显示在CONTRACT BYTE CODE中,接下来我们在右侧SELECT CONTRACT TO DEPLOY中选择待部署的合约名称,我们的代币合约名称是MyToken,选择好后在下方输入初始代币数量,这个数量会提供给构造函数执行,我们输入了 10000。一切准备妥当后,点击界面下部的DEPLOY按钮执行部署,弹出界面如下面第三个界面。
上图显示了合约创建的一些摘要信息,部署的账户地址以及需要耗费的Gas,在主链上部署时会根据Gas以及Gas Price计算出需要花费的以太币金额,我们现在是在单机私链上操作,因此没有这些限制,可以直接进行部署,点击SEND TRANSACTION即可发起一个部署交易,执行后回到合约主界面,可以看到底部显示部署状态,如下所示:
读者可能发现一直显示着这个状态,似乎部署不上去,原因可能是没有开启挖矿,部署的时候必须处于挖矿状态才能成功,开启挖矿后就部署成功了,部署后可以查看这条部署交易信息:
可以看到这条部署交易的账户地址、已确认的区块数、合约部署的区块高度等信息,也可以看到部署的合约地址。在以太坊 中,部署合约也属于一种交易事务。部署完成后,我们可以在合约操作的主界面上点开WATCH TOKEN,让以太坊钱包以数字货币的视角来识别这份智能合约,打开后界面如下面第一个界面图。
在TOKEN CONTRACT ADDRESS中输入合约地址即可,下面是名称、符合等信息,可填可不填,完成后点击OK按钮就引入了这个合约,可以看到主界面已经识别到了这个合约。如下面第二个界面图。这里显示了初始数量为10000,至此部署就全部完成了。
有读者会觉得奇怪,这么部署一下就创造了一种数字代币?这也太简单了吧。准确地说,基于以太坊开发数字代币很容 易。如果没有一个这样的基础平台,从零开发还是有些复杂的,实际上,以太币本身也是一种合约,只不过合约规则是固化在以太坊代码中的。部署完成后,就可以 发送给账户地址了,我们创建另外一个以太坊账户地址,然后做一次转账操作,进入到SEND界面,选择主账户并选择MyToken代币,如下面第三个界面图 所示。
在转账金额一栏填入一个金额(如2000),填写完毕后点击“发送”即可,我们分别来看一下主账户和接收账户的MyToken余额。
1)主账户:
2)接收账户:
通过上述介绍,我们了解了在以太坊中通过智能合约创建数字代币的过程,当然我们只是演示了一个最简单的代码版本。通常对于一个代币来说,还会有其他多项功 能,比如获得账户余额,获得代币总量,设置冻结周期和数量等。以太坊上的智能合约代币有一个标准,也就是ERC20令牌标准,标准中约定了一系列的事件行 为和规则,应用开发者、交易平台、钱包客户端等多方如果都遵循标准来开发和识别代币,就可以做到事先的接口对应,类似于一个协议,方便代币在业务生态中平 滑流转。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=81
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
- 9.3 parity概述2018-09-15 09:53
- 11.4 什么时候适合去中心化2018-09-12 10:27
- 银行应用软件:零售银行业务中谁才是赢家2018-09-04 23:10
- 第4章 数据驱动,区块链与数据挖掘2018-09-28 16:55
网站分类
- 数据结构
- 数据结构视频教程
- 数据结构练习题
- 数据结构试卷
- 数据结构习题解析
- 数据结构电子书
- 数据结构精品文章
- 区块链
- 区块链精品文章
- 区块链电子书
- 大数据
- 大数据精品文章
- 大数据电子书
- 机器学习
- 机器学习精品文章
- 机器学习电子书
- 面试笔试
- 物联网/云计算
标签列表
- 数据结构 (39)
- 数据结构电子书 (20)
- 数据结构习题解析 (8)
- 数据结构试卷 (10)
- 区块链是什么 (261)
- 数据结构视频教程 (31)
- 大数据技术与应用 (12)
- 百面机器学习 (14)
- 机器学电子书 (29)
- 大数据电子书 (37)
- 程序员面试 (10)
- RFID (21)
最近发表
- 找出数组中有3个出现一次的数字
- 《百面机器学习》电子书下载
- 区块链精品电子书《深度探索区块链:Hyperledger技术与应用_区块链技术丛书》张增骏
- 区块链精品电子书《比特币:一个虚幻而真实的金融世界》
- 区块链精品电子书《图说区块链》-徐明星 & 田颖 & 李霁月
- 区块链精品电子书《是非区块链:技术、投机与泡沫》-英国《金融时报》
- 区块链精品电子书《商业区块链:开启加密经济新时代》-威廉·穆贾雅
- 区块链精品电子书《人工智能时代,一本书读懂区块链金融 (互联网_时代企业管理实战系列)》-马兆林
-
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https'){
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else{
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区