近日EOS主网6月2日上线,360发现EOS漏洞,全民在炒币中惶恐与兴奋。EOS到目前为止是基于ETH智能合约建立的Token(代币)。本期女神分享最简单的以太坊发代币智能合约,发币不再陌生。比特币原理详见前文
《DBA女神讲解区块链原理》
EOS 6月2日主网上线
坐等财富自由迎娶朕
01
Dapp是什么?
先了解概念方便后文理解:
以太坊:一个开源的具备智能合约功能的公共区块链平台(公链)。
以太币ETH:以太坊的加密货币,交易所对应ETH。
智能合约:一个自动担保账户功能,例如当满足特定条件时,程序就会释放和转移资金。也是一种编码,依靠EVM部署在每个节点。
太坊虚拟机EVM:Ethereum Virtual Machine,运行在以太坊每个节点上,
处理点对点合约,智能合约执行引擎,相当于底层操作系统。
区块链去中心化的应用程序通常为 DApp(Decentralized App),它由智能合约和后端代码构成。DApp的目标是让你的智能合约有一个友好的界面,外加有利于用户使用的东西。典型的DApp例子由一个html界面,web3运行库,一段JS代码以及部署在区块链上的一段智能合约组成。
DApp通过提交交易到区块链网络与对应的智能合约进行交互,并且从区块链网络而不是中心化数据库(例如MYSQL数据库)读取重要数据。
智能合约代码以 JsonPRC 的方式提供给应用程序进行调用,而此时,智能合约就如以太坊中的转账操作一样,被广播到所有节点上,通知这些节点运行被调用的智能合约 ABI(二进制接口),这些被调用的 ABI 会各自运行在该节点的虚拟机(EVM)中。最后通过区块链的生成将运行过程和结果打包进区块链,并通过区块链的同步实现全网统一。
- Dapp框架-
编写智能合约语言:
以太坊去中心化的核心是其可以运行图灵完备的脚本语言,开发以太坊智能合约则有四种语言:Serpent、Solidity、Mutan、LLL,都面向底层设计的语言。
Solidity 是首选语言,语法类则似于使用广泛的 Java。再加上 Solidity 的语言特性较少,该语言则可以更简单地实现完备的智能合约体系。
02
搭建Dapp环境
2.1 搭建条件
Truffle是一个世界级智能合约开发环境,内置智能合约编译器,用脚本即可完成合约编译/部署及单元测试,简化智能合约开发生命周期。
智能合约必须要部署到链上进行测试。Truffle官方推荐使用以下两种客户端:
● Ganache 前身testRPC,有图形界面和命令行两种形式。
● truffle develop truffle内置的客户端,跟命令行版本的Ganache基本类似。
本文采用 Ganache图形界面形式。
● Windows: Ganache-*.appx
● Mac: Ganache-*.dmg
● Linux: Ganache-*.AppImage
Ganache命令行版本:
sudo npm install -g ganache-cli
2.2 搭建环境基本指令
$ npm install -g truffle 安装Truffle
$ truffle -v 查看版本号
$ npm install -g truffle
$mkdir dapptest 首先准备一个目录存放项目
$truffle unbox webpack 构建一个基于webpack的项目
$truffle compile 编译合约
$truffle migrate 部署智能合约
注意的是truffle为了增加开发的灵活性,不再初始化项目成web应用,使用原来的truffle init指令生成的项目会缺少web相关文件,对于新手而言,建议选择webpack。
3.3 文件框架如下
-Dapp工程文件框架 -
contracts文件夹是智能合约文件,其中metaCoin.sol文件是发币智能合约,ConvertLib.sol是外部类库文件,这里是币兑换率转换的合约文件。也即Dapp框架里的智能合约部分。
migrations文件夹是智能合约部署文件路径。
app文件夹下存放前端应用页面相关文件,比如html/Js/css文件,
Dapp框架里的前端页面部分内容存在app文件夹下,合约内容存在contracts下,Ganache相当于模拟以太坊环境, 这里是一个区块链节点。
03
智能合约代码解析
合约将实现一个形式最简单的加密货币,而且任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。 metacoin合约是用Solidity语言编写的,通过solc编译成字节码,然后在发生外部访问时被以太坊虚拟机EVM执行。
3.1解析 MetaCoin.sol
声明solidity版本,保证代码的兼容性。
通过import关键字导入外部类库ConvertLib
声明合约/变量及事件:
MetaCoin代表智能合约,MetaCoin 要求合约名称与文件名称一致,使用contract关键词 。balances是mapping类型变量,存储所有账号的余额。可以理解HashMap。
合约的构造函数:只会在创建合约时候被调用一次,之后就永远不会被调用了,tx是全局变量,表示当前的交易发送者,在构造函数里就是合约的创造者。tx.origin返回 address类型,也就是当前交易的发送账号地址。
balances[tx.origin] = 10000,当前交易的发送账号地址对应的账号余额,给创建者账号存入10000 metaCoin代币。
sendCoin转账方法:
参数receiver 接收者账号的地址,amount代表转账全额 bool sufficient 代表返回值是否成功。
solodity权限修饰符号 public及return在函数右边。
“if (balances[msg.sender]
msg.sender就是这次调用发起人的地址,当前帐号减掉转账余额。
balances[receiver] += amount; 接收者余额增加转账金额。
执行转账事件,从而外部监听可以收到通知。
可用emit Transfer(msg.sender, receiver, amount);
返回成功。
获取账户以太币余额方法:这里是用于代币(metacoin)转换成以太币的余额, 用到前面的外部类库ConvertLib。
address addr 想要获取余额的帐号地址。
returns(uint) 返回 uint类型的。
使用view类型声明函数,保证不修改状态。
获取账户余额方法:
address addr 想要获取余额的帐号地址。
returns(uint) 返回uint类型。
3.2 ConvertLib.sol
ConvertLib.sol是外部的类库,其实就是以太币与代币之间的兑换率的实现方法
获取余额方法函数中用到可以把代币转换成以太币
uint amount 代币(metacoin) 余额
uint conversionRate 代币跟以太币的转换率
uint convertedAmount 转换成以太币
比如conversionRate=2,那么就是1个代币=2个以太币
3.3 truffle.js
Ganache默认运行在7545端口,可以在界面右上方的“设置”里进行更改。配置文件,需要把IP、端口、网络ID告诉truffle
3.4 测试运行如下
直接用下面的命令运行metacoin的示例代码:
运行后可以在Ganache图形界面查看对应账户/交易记录/区块及打包日志信息。
默认创建10个账号,每个账号里有100ETH的余额。
accounts标签:第一个账户里ETH略有减少,因为交易消耗了gas,可以看到10个用户余额。
Transactions标签:有6笔新交易,可以点开查看交易详情。
数据库块标签,可以显示生成数据块情况。
Logs标签:显示交易和挖矿日志。
本文讲解了搭建dapp智能合约基本步骤及发代币的智能合约逻辑。
下一期详述以太坊智能合约实现原理,敬请期待。关注公众号回复“区块链”获取区块链超全面学习资料。
领取专属 10元无门槛券
私享最新 技术干货