以太坊智能合约开发之代币合约

简介: 智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助。以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分:智能合约的开发用户界面的开发在本文中,我们将介绍智能合约的开发语言solidity。

智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用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可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些代币到某个地址,在区块链浏览器中查询该地址将什么也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的“区块链浏览器”。

分享两个教程和一些免费资料给读者:

  1. 适合区块链新手的以太坊DApp开发教程

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

收集整理了一些免费区块链、以太坊技术开发相关的文件,有需要的可以下载,文件链接:

  1. web3.js API官方文档中文版:https://pan.baidu.com/s/1hOV9hEzi7hFxJCL4LTvC6g

  2. 以太坊官方文档中文版 :https://pan.baidu.com/s/1ktODJKLMBmkOsi8MPrpIJA

  3. 以太坊白皮书中文版 :https://pan.baidu.com/s/1bzAFnzJ35hlQxJ2J4Oj-Ow

  4. Solidity的官方文档中文版 :https://pan.baidu.com/s/18yp9XjEqAHpiFm2ZSCygHw

  5. Truffle的官方文档中文版 :https://pan.baidu.com/s/1y6SVd7lSLUHK21YF5FzIUQ

  6. C#区块链编程指南 :https://pan.baidu.com/s/1sJPLqp1eQqkG7jmxqwn3EA

  7. 区块链技术指南 :https://pan.baidu.com/s/13cJxAa80I6iMCczA04CZhg

  8. 精通比特币中文版 :https://pan.baidu.com/s/1lz6te3wcQuNJm28rFvBfxg

  9. Node.js区块链开发 :https://pan.baidu.com/s/1Ldpn0DvJ5LgLqwix6eWgyg

  10. geth使用指南文档中文版 :https://pan.baidu.com/s/1M0WxhmumF_fRqzt_cegnag

  11. 以太坊DApp开发环境搭建-Ubuntu : https://pan.baidu.com/s/10qL4q-uKooMehv9X2R1qSA

  12. 以太坊DApp开发环境搭建-windows :https://pan.baidu.com/s/1cyYkhIJIFuI2oyxM9Ut0eA

  13. 以太坊DApp开发私链搭建-Ubuntu : https://pan.baidu.com/s/1aBOFZT2bCjD2o0EILBWs-g

  14. 以太坊DApp开发私链搭建-windows :https://pan.baidu.com/s/10Y6F1cqUltZNN99aJv9kAA

相关文章
|
1月前
|
供应链 区块链
区块链DAPP质押合约代币系统开发|模式方案
智能合约是一种数字化的合约,它将合约内容写入区块链中,保证了合约的公开透明
|
2月前
|
人工智能 安全 区块链
DAPP合约代币质押系统开发方案需求|说明
区块链智能合约的发布方式不仅仅关乎技术手段,更是涉及到人性化和自然化的问题
|
3月前
|
区块链
dapp质押代币系统开发|合约技术搭建
智能合约是一种通过计算机程序实现自动执行合约的协议。
|
4月前
|
存储 安全 区块链
DAPP质押合约代币系统开发案例模式
在Web 3.0中,任何人都可以从任何地方参与,他们可以通过开源软件做出贡献
|
7月前
|
安全 JavaScript 前端开发
DAPP智能合约交易系统开发详解 | DAPP智能合约交易系统源码合约规则解析
智能合约不仅以与传统合约相同的方式定义了协议的规则和处罚,还可以自动强制执行这些义务。它通过接受信息作为输入,通过规则为输入赋值,在合约中列出并执行这些合约条款所要求的行为
|
9月前
|
存储 安全 区块链
DAPP|去中心化交易系统开发(合约代币发行)
区块链是一种特殊的分布式系统 etherStore.withdraw
|
9月前
|
存储 安全 区块链
区块链智能合约DAPP开发|DAPP合约代币项目开发(案例说明)
区块链技术使用了分布式网络来实现去中心化
|
JSON JavaScript 前端开发
以太坊 – 部署智能合约到Ganache
将编译好的智能合约部署到本地的Ganache区块链网络。步骤如下:更新项目的配置文件,修改网络配置连接到本地区块链网络(Ganache)。创建迁移脚本,告诉Truffle如何部署智能合约。运行新创建的迁移脚本,部署智能合约。...
1476 0
以太坊 – 部署智能合约到Ganache
|
测试技术 区块链 数据安全/隐私保护
秒合约币安交易所怎么搭建开发BNB智能合约代码
币安币 (BNB) 是币安链的原生加密货币,币安链是一个用于数字资产交易和交换的区块链平台。 币安链确实支持智能合约的创建和执行,开发人员可以使用简单账本协议(SLP)和币安链开发工具包(BDK)创建自己的自定义合约。
|
存储 测试技术 区块链
如何搭建数字货币交易所的chia智能合约代码
Chia 是一种使用空间证明和时间证明共识机制而不是工作量证明的加密货币。 与以太坊不同,Chia 没有传统的智能合约平台。