官宣:https://www.ethereum.org/token

核心逻辑演进按照官网的示例,个人的工作就是从我自己的视角讲清楚这个逻辑。图文仅作为参考。

首先我们需要知道,标准的发币合约是比较复杂的,我们这里先从最简单的开始入手。

pragma solidity ^0.4.20;contract MyToken {/* 一个类似字典的结构,链上存储--存储的是所有账户的余额,key是地址,value是余额 */mapping (address => uint256) public balanceOf;/*初始化:初始发行总量全归创建者所有*/function MyToken(uint256 initialSupply) public {balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens}/* 发送代币的函数 */function transfer(address _to, uint256 _value) public returns (bool success) {require(balanceOf[msg.sender] >= _value);           // Check if the sender has enoughrequire(balanceOf[_to] + _value >= balanceOf[_to]); // Check for overflowsbalanceOf[msg.sender] -= _value;                    // Subtract from the senderbalanceOf[_to] += _value;                           // Add the same to the recipientreturn true;}
}

代码拆解

 contract MyToken {/* This creates an array with all balances */mapping (address => uint256) public balanceOf;}

mapping数据结构是个字典,存储键值到值的映射,这里是从地址到余额的映射。

如果就把上面这个合约部署到链上,啥用都没有。所以我们接着增加一些功能进来:

contract MyToken {mapping (address => uint256) public balanceOf;function MyToken() {balanceOf[msg.sender] = 21000000; // 比特币的总量~}
}

显式增加一个构造函数,加上一行代码,往msg.sender这个账户里新增2100万个ETH。

这里的数字没有其他特别含义,可以任意指定,而更好的方式则是,把它作为变量,将来可以改动。

contract MyToken {mapping (address => uint256) public balanceOf;function MyToke(uint initialSupply) {balanceOf[msg.sender] = initialSupply;}
}

至此,我们创建的智能合约,就一个构造函数,创建者地址里多出来初始发行量的代币了,但是还没有转移代币的功能。时刻记住,智能合约编译后放在链上自动运行,像个智能体一样,功能是我们定义好的,暴露出来,交给事件自动触发执行。

现在我们为它加上转移代币的功能:

contract MyToken() {mapping(address => uint256) public balanceOf;function MyToken(uint256 initialSupply) {balanceOf[msg.sender] = initialSupply;}function transfer(address _to, uint256 _value) public {balanceOf[msg.sender] -= _value;balanceOf[_to] += _value;}
}

这里添加的是直接的转账逻辑,从发送者msg.sender账户里减去_value数量的代币,并将其加到_to账户地址里。

这是有问题的,问题在哪里呢?发送者钱够不够转呢?接收者收到代币后会不会值溢出?

transfer函数里,添加一行:

require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to] )

上面这个简单合约里还没有代币的基本信息,先设定好保存基本信息的容器:

string public name;
string public symbol;
uint8 public decimals;

这些信息在构造器函数中使用:

function MyToken(uint256 initialSupply, string tokenSymbol, uint8 decimalUnits) {require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to] )balanceOf[msg.sender] = initialSupply;name = tokenSymbol;decimals = decimalUnits;
}

现在是时候创建一些事件了。

什么是事件?

所谓事件呢,就是一些特殊的空函数,我们可以调用这些函数来帮助以太坊客户端,比如以太坊钱包来跟踪合约上发生的活动。事件需要以大写字母开头。

事件的使用分成两个步骤

  • 声明事件:event关键字
  • 发射事件:emit关键字

声明事件的方式

event Transfer(address indexed from, address indexed to, uint256 value);

注意到这里声明时,地址类型后面跟着一个修饰符indexed,现在我还不知道为啥要这个,但先记着。

使用事件的方式
事件定义完成之后,需要在合适的地方发射出去,让这个世界知道。这里的转账事件需要在transfer函数后面加上。

function transfer(address _to, uint256 _value) public {require(balanceOf[msg.sender] >= _value && balanceOf[_to] + _value >= balanceOf[_to] )balanceOf[msg.sender] -= _value;balanceOf[_to] += _value;// 发射事件: 告知在监听的所有人,事件发生了emit Transfer(msg.sender, _to, _value);
}

事件很像是C++里面的函数,先声明后调用。事件本质上是个函数,所以在emit时,也是按照调用函数的逻辑来运行。

基础篇到此为止,具体如何部署,由于本人没有用基于Mist的客户端跑通,而基于Remix的之前写过,有些地方不太一样,大体还是可用的:https://bihu.com/article/16183

下一篇讲进阶。

END.

【以太坊开发】发币指南--基础篇相关推荐

  1. 以太坊开发入门,完整入门篇(小白可以看看,高手看看自己有没有遗漏的

    2019独角兽企业重金招聘Python工程师标准>>> 翻译自:https://medium.com/@mattcondon/getting-up-to-speed-on-ether ...

  2. 以太坊开发入门,完整入门篇

    一个适合区块链新手的以太坊DApp开发教程: http://xc.hubwiz.com/course/5a952991adb3847553d205d1 一个用区块链.星际文件系统(IPFS).Node ...

  3. 【以太坊开发】发币指南--进阶篇

    参考:https://www.ethereum.org/token pragma solidity ^0.4.16;interface tokenRecipient { function receiv ...

  4. 以太坊是什么 - 以太坊开发入门指南

    本文首发于深入浅出区块链社区 原文链接:以太坊是什么 - 以太坊开发入门指南 很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及 ...

  5. 币图网以太坊开发实例_去中心化概念模型与架构设计

    IM 去中心化概念模型与架构设计 今天打算写写关于 IM 去中心化涉及的架构模型变化和设计思路,去中心化的概念就是说用户的访问不是集中在一个数据中心,这里的去中心是针对数据中心而言的. 站在这个角度而 ...

  6. 在以太坊开发自己的ERC-20代币及如何ICO

    今天我将向你展示如何在以太坊区块链上开发你自己的加密货币并将其出售!我将向你展示如何使用以太坊智能合约逐步创建自己的ERC-20代币和众筹销售,如何测试智能合约,如何将智能合约部署到以太坊区块链,以及 ...

  7. eth geth 安卓_零基础学习以太坊开发--安装和使用以太坊客户端geth

    一.预备知识 想从事区块链开发,了解以太坊开发的程序员,在刚开始接触以太坊的时候,发现有很多的新名词: EVM solidity go-ethereum(geth) pyethereum Testrp ...

  8. 用OpenZeppelin在RSK上进行以太坊ERC20代币开发

    在本文中,我们将讨论通过RSK网络部署和交互Smart-Contracts智能合约.我们的合约将是一个基于OpenZeppelin库的ERC20代币,我们将把它直接部署到Mainnet中. 创建合约 ...

  9. 以太坊java开发指南_java以太坊开发库ethereumj

    EthereumJ是以太坊协议的纯Java实现.有关以太坊及其目标的高级信息,请访问ethereum.org,其 白皮书 提供了一个完整的概念的概述,和 黄皮书 一起提供了协议的正式定义. 我们尽可能 ...

最新文章

  1. UE4 AR开发笔记
  2. 《价值50亿的10句话》读后感(学生作业分享)
  3. springboot连接容器内mysql_docker部署springboot项目,连接mysql容器
  4. 为什么项目开放源代码之后就变成死项目 很少或几乎不再更新
  5. C/C++ 文件的后缀名
  6. mysql简单的命令_Mysql 的一些简单的命令
  7. K3/Cloud点按钮打开单据,列表,动态表单,简单账表和直接Sql报表示例
  8. “不差钱”华为刷屏 拟募资60亿!
  9. 11-提升R语言程序性能gc()
  10. JavaScript学习(七十九)—值传递和地址传递
  11. OO视角的重构技巧-if\switch 的消除
  12. VMware ESX虚拟磁盘性能测试
  13. 泰山JDK8新实现的一个字体斜体效果
  14. 数字电视-DVB介绍
  15. [案例分享]金融大数据:三大应用场景提升营销收益 (二)
  16. ❀❀❀Excel加载项开发及发布❀❀❀
  17. 用户画像 各维度表的结构图
  18. 微信小程序云开发CMS内容管理平台csv上传乱码或失败的解决方法
  19. 1 同业拆出,和同业拆入的定义
  20. GPM数据批量下载教程

热门文章

  1. 深入理解数据类型、变量类型属性、内存四区和指针
  2. ios开发 方形到圆的动画_使用UIBezierPath画个圆动画
  3. insert oracle用法,insert into select的实际用法,insertselect
  4. pb 数据窗口插入数据_46MB 变4.5PB 数据炸弹:新方法突破性压缩资料
  5. ajax传递数组_利用AJAX+PHP+MySQL实现不重新加载页面进行用户名已注册检测
  6. php7单独运行,如何让PHP 7运行更加神速
  7. java堆栈方法区_java 栈 ,堆, 方法区
  8. android r中的变量_R中的变量
  9. Python –将NumPy数组转换为列表
  10. python列表连接_Python连接列表