智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。

以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分:

  • 智能合约的开发
  • 用户界面的开发

在本文中,我们将介绍智能合约的开发语言solidity。

让我们先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节。

contract SimpleStorage {uint storedData;function set(uint x) {storedData = x;}function get() constant returns (uint retVal) {return storedData;}
}

在Solidity中,一个合约由一组代码(合约的函数)和数据(合约的状态)组成。合约位于以太坊区块链上的一个特殊地址。

uint storedData; 这行代码声明了一个状态变量,变量名为storedData,类型为 uint (256bits无符号整数)。你可以认为它就像数据库里面的一个存储单元,跟管理数据库一样,可以通过调用函数查询和修改它。在以太坊中,通常只有合约的拥有者才能这样做。在这个例子中,函数 set 和 get 分别用于修改和查询变量的值。

跟很多其他语言一样,访问状态变量时,不需要在前面增加 this. 这样的前缀。

这个合约还无法做很多事情(受限于以太坊的基础设施),仅仅是允许任何人储存一个数字。而且世界上任何一个人都可以来存取这个数字,缺少一个(可靠的)方式来保护你发布的数字。任何人都可以调用set方法设置一个不同的数字覆盖你发布的数字。但是你的数字将会留存在区块链的历史上。稍后我们会学习如何增加一个存取限制,使得只有你才能修改这个数字。

编写代币合约

接下来的合约将实现一个形式最简单的加密货币。任何人都可以发送货币给其他人,不需要注册用户名和密码,只要有一对以太坊的公私钥即可。

contract Coin {
//关键字“public”使变量能从合约外部访问。address public minter;mapping (address => uint) public balances;//事件让轻客户端能高效的对变化做出反应。event Sent(address from, address to, uint amount);//这个构造函数的代码仅仅只在合约创建的时候被运行。function Coin() {minter = msg.sender;}function mint(address receiver, uint amount) {if (msg.sender != minter) return;balances[receiver] += amount;}function send(address receiver, uint amount) {if (balances[msg.sender] < amount) return;balances[msg.sender] -= amount;balances[receiver] += amount;Sent(msg.sender, receiver, amount);}
}

这个合约引入了一些新的概念,让我们来逐个介绍。

address public minter;

这行代码声明了一个可公开访问的状态变量,类型为address。address类型的值大小为160 bits,不支持任何算术操作。适用于存储合约的地址或其他人的公私钥。public关键字会自动为其修饰的状态变量生成访问函数。没有public关键字的变量将无法被其他合约访问。另外只有本合约内的代码才能写入。自动生成的函数如下:

function minter() returns (address) { return minter; }

当然我们自己增加一个这样的访问函数是行不通的。编译器会报错,指出这个函数与一个状态变量重名。

下一行代码创建了一个public的状态变量,但是其类型更加复杂:

mapping (address => uint) public balances;
该类型将一些address映射到无符号整数。mapping可以被认为是一个哈希表,每一个可能的key对应的value被虚拟的初始化为全0.这个类比不是很严谨,对于一个mapping,无法获取一个包含其所有key或者value的链表。所以我们得自己记着添加了哪些东西到mapping中。更好的方式是维护一个这样的链表,或者使用其他更高级的数据类型。或者只在不受这个缺陷影响的场景中使用mapping,就像这个例子。在这个例子中由public关键字生成的访问函数将会更加复杂,其代码大致如下:

function balances(address _account) returns (uint balance) {return balances[_account];
}

我们可以很方便的通过这个函数查询某个特定账号的余额。

event Sent(address from, address to, uint value); 

这行代码声明了一个“事件”。由send函数的最后一行代码触发。客户端(服务端应用也适用)可以以很低的开销来监听这些由区块链触发的事件。事件触发时,监听者会同时接收到from,to,value这些参数值,可以方便的用于跟踪交易。为了监听这个事件,你可以使用如下代码:

Coin.Sent().watch({}, '', function(error, result) {if (!error) {console.log("Coin transfer: " + result.args.amount +" coins were sent from " + result.args.from +" to " + result.args.to + ".");console.log("Balances now:\n" +"Sender: " + Coin.balances.call(result.args.from) +"Receiver: " + Coin.balances.call(result.args.to));}
}

注意在客户端中是如何调用自动生成的 balances 函数的。

这里有个比较特殊的函数 Coin。它是一个构造函数,会在合约创建的时候运行,之后就无法被调用。它会永久得存储合约创建者的地址。msg(以及tx和block)是一个神奇的全局变量,它包含了一些可以被合约代码访问的属于区块链的属性。msg.sender 总是存放着当前函数的外部调用者的地址。

最后,真正被用户或者其他合约调用,用来完成本合约功能的函数是mint和send。如果合约创建者之外的其他人调用mint,什么都不会发生。而send可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些代币到某个地址,在区块链浏览器中查询该地址将什么也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的“区块链浏览器”。


顺便安利几个区块链、以太坊开发DApp的实战教程:
1.适合区块链新手的以太坊DApp开发

2.用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台

3.C#开发以太坊区块链的教程

4.EOS智能合约与DApp开发入门

5.java开发以太坊区块链的教程,web3j开发详解

6.PHP开发以太坊区块链的教程

7.python用web3.py开发以太坊区块链应用的教程

转载于:https://blog.51cto.com/13697184/2107539

solidity开发以太坊代币智能合约相关推荐

  1. 以太坊代币空投合约的实现

    2019独角兽企业重金招聘Python工程师标准>>> 本文将介绍如何在以太坊智能合约中实现代币的空投.区块链以太坊世界中所谓空投(airdrop),就是免费给你的区块链地址(公钥) ...

  2. Foundry教程:ERC-20代币智能合约从编写到部署全流程开发

    概述 如果你想获得更好的阅读体验,请前往我的博客 本博客的内容主要分为以下四部分: 一是Foundry的介绍与安装,主要介绍为什么选择Foundry进行智能合约开发和安装过程中的各种官方文档中未提及的 ...

  3. 元宇宙应用开发实例——以太坊里的智能合约和Decentraland里的3D前端交互组件

    目录 1. 元宇宙核心技术 2. 元宇宙实例及应用实例 3. 以太坊里的智能合约开发 3.1. World Wide Web的访问能力 3.2. 初始化以太坊钱包 3.3. 开发4方合约 3.4. 手 ...

  4. 基于以太坊网络的智能合约开发、部署和测试(入门)

    为什么80%的码农都做不了架构师?>>>    基本概念: 以太坊是一个开放的.公开的区块链平台,允许用户构建自己的去中心化应用在上面运行 Solidity是一种语法类似JavaSc ...

  5. 以太坊可更新智能合约研究与开发综述

    原文地址:https://ethfans.org/posts/ethereum-upgradeable-smart-contract-strategies 这篇文章是对以太坊可更新智能合约领域里的研究 ...

  6. 3.25 以太坊:实战智能合约众筹1

    这次我们来看看怎么实现以太坊的众筹智能合约案例,首先我们了解一下下面的概念  1.什么是ICO?  ICO是以初始产生的数字加密货币作为投资回报的一种筹措资金的方式,它的概念源自证券界的Initial ...

  7. 以太坊代币标准: ERC20、ERC223的介绍与比较

    代币(Token)是区块链中定义价值的方式,用于标定金融或数字资产.在以太坊上,代币使用相同的标准,这样代币之间的兑换和DAPP支持就会变得容易. 什么是ERC20标准 ERC-20 标准是在2015 ...

  8. 以太坊代币事件监控_以太坊:什么是ERC20标准?

    不以规矩,不能成方圆 许多人应该都听过 代码即法律(Code Is Law),因为程序写完了,无论执行多少次都会得到同样的结果,除非有外界因素的干扰.在多人协作的过程中一定是要按照一个标准来进行分工, ...

  9. 以太坊—开放的智能合约完整解决方案

    什么是以太坊(Ethereum)? 通俗的讲,以太坊是一种新的法律.传统的合同合约依据法律订立,执行.违约处理依赖律师.法院:以太坊解决了这一系列问题,合约通过程序订立.执行,人工无法干预,所以几乎可 ...

最新文章

  1. int*p[ ]与int(*p)[ ]的不同
  2. Linux - 收藏集 - 掘金
  3. python可变参数记录
  4. 牛客网【每日一题】5月27日题目精讲 货币系统
  5. 在Ubuntu环境下使用vcpkg安装sqlite_orm包文件
  6. Map集合使用get方法返回null抛出空指针异常问题
  7. P1948 [USACO08JAN]Telephone Lines S(二分+spfa)
  8. 获取组织分类后群数据
  9. 行为驱动开发BDD和Cucunber简介
  10. 生活感悟,人生正能量!--摘自张瑞敏演讲语录
  11. 自定义进度条PictureProgressBar——从开发到开源发布全过程
  12. 矩阵和向量的范式(Norms for Vectors and Matrices)
  13. Windows配置域名
  14. 西密歇根大学计算机科学专业排名,西密歇根大学计算机工程硕士排名第86(2020年TFE Times排名)...
  15. C语言 从txt文件中提取特定的数据
  16. 关于uniapp获取ios客户端平台安全距离(底部导航条)的方法
  17. 游戏设计艺术 第2版 第30章 读书笔记
  18. 031 | 弘文民彩▪藏族特色文化产品 | 大学生创新训练项目申请书 | 极致技术工厂
  19. wpa_cli 操作指令使用指南
  20. 图像处理:电网图资智能识别技术的研究的步骤

热门文章

  1. python关键字和保留字_或带有Python示例的关键字
  2. 我的世界方块云服务器bug,我的世界:两个方块能无限刷经验?这装置太BUG了
  3. python嵌入c代码_怎样把Python代码嵌入到C程序
  4. thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】
  5. 《C++ Primer 第五版》第二章(第5小节)——using和typedef,auto和decltype总结
  6. sql语句的经典练习
  7. C++创建对象:栈和堆的区别
  8. 模块之re模块 —— 正则
  9. Python实现三级菜单(字典和列表的使用)
  10. 20155305乔磊2016-2017-2《Java程序设计》第四周学习总结