三分钟解读以太坊发代币智能合约

近日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智能合约基本步骤及发代币的智能合约逻辑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注