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

原文地址:http://blog.51cto.com/13697184/2107539

时间: 2024-08-25 18:32:42

solidity开发以太坊代币智能合约的相关文章

以太坊代币合约详析

以太坊代币 在以太坊系统中,存在作为基础货币的 Ether(以太),以及同样可以作为货币使用的 Token(代币). 以太坊与其他加密货币的主要不同在于,以太坊不是单纯的货币,而是一个环境/平台.在这个平台上,任何人都可以利用区块链的技术,通过智能合约来构建自己的项目和DAPPS(去中心化应用). 如果把以太坊理解成互联网,DAPPS则是在上面运行的网页.DAPPS是去中心化的,意味着它不属于某个人,而是属于一群人.DAPPS发布的方式通常是采用被称为 ICO 的众筹方式.简单来说,你需要用你的

以太坊代币开发虚拟币钱包交易平台开发

以太坊代币开发虚拟币钱包交易平台开发156-3841-3841 作为一种加密数字货币,比特币价格在过去几年里暴涨,到2017年底时曾达到近两万美元,令许多人感到不可思议. 然而自2018年以来,比特币价格开始下跌,特别是在近期上演"大跳水".11月20日,比特币重挫逾16%,跌破4100美元,为去年10月以来的最低水平.比特币的暴跌,也引发其他加密货币大幅下挫.CoinMarketCap数据显示,目前整个加密货币市场价值已跌至约1500亿美元左右,与今年初时的8500亿美元规模相比严重

虚拟币钱包以太坊代币技术开发

虚拟币钱包以太坊代币技术开发156-3841-3841 然而自2018年以来,比特币价格开始下跌,特别是在近期上演"大跳水".11月20日,比特币重挫逾16%,跌破4100美元,为去年10月以来的最低水平.比特币的暴跌,也引发其他加密货币大幅下挫.CoinMarketCap数据显示,目前整个加密货币市场价值已跌至约1500亿美元左右,与今年初时的8500亿美元规模相比严重缩水.市场的大幅波动,引发人们对"加密货币能否成为可靠保值手段"的质疑. 有业内人士认为,此次比

创建自己的加密货币MNC——以太坊代币(二)

创建一个基于以太坊平台的分红币MNC,根据持有的代币数量,进行分红的算法.github地址: https://github.com/lxr1907/MNC 1.使用以太坊根据比例换购token MNC 2.定期根据使用用户资金购买的矿机挖ETH,打入该合约,触发分红方法根据token持有比例分红 3.衰减,由于矿机有折旧衰减损坏的概率,token会随着持有时间而衰减. 代码如下 pragma solidity ^0.4.19; contract owned { address public ow

Erc20Tokens:以太坊代币数据集

Erc20Tokens数据集包含超过1000种主流的以太坊ERC20代币的描述数据清单和图标,可用于钱包等区块链应用的开发,支持使用Java.Python.Php.NodeJs.C#等各种开发语言查询主流ERC20代币的相关数据.下载链接:ERC20代币数据集. 1.数据集概述 以下是ERC20代币数据集中部分代币的图标示意: Erc20Tokens数据集的的当前版本为1.0.0,主要文件清单参见:http://sc.hubwiz.com/codebag/erc20-tokens-dataset

创建自己的区块链合约java版web3接口——以太坊代币(四)

texas-web3j-solidity项目是一个java版本的,使用web3j包和eth网络交互的小程序. 主要实现了以下功能: 1.发布合约 2.发起转账 3.查询交易 4.调用智能合约方法 texas-web3j-solidity项目在官方例子基础上做了以下几点功能性修改: 1.增加texas合约,用于游戏充值提现等功能 2.以太坊测试网络切换为ropsten,该测试网络更容易获取测试eth,地址为:https://www.ropsten.io/#faucet 3.增加spring-boo

科普贴 | 以太坊代币钱包MyEtherWallet使用教程,一步步教你玩转MEW

MyEtherWallet 是一个以太坊的网页钱包,使用非常简单,打开网页就可以使用,源代码开源,不会在服务器上存储用户的钱包信息如私钥和密码.支持 Ledger Wallet.TREZOR 等硬件钱包,功能极为丰富.是一把我们经常会用到的瑞士军刀! Myetherwallet 支持符合 ERC20 标准的代币(即以太坊系代币). 官网:https://www.myetherwallet.com/ ,一定要认准网址. 创建钱包1. 打开官网,将页面切换为中文,设置一个钱包密码(不少于9位,一定要

创建自己的区块链游戏SLOT——以太坊代币(三)

一个以太坊合约版本的轮盘游戏,向合约转账ETH,有几率获得3,5,10,100倍奖励 合约地址:0x53DA598E70a1505Ad95cBF17fc5DCA0d2c51174b 捐赠ETH地址:0xdc834D429b3098f0568Af873c2d73b08790BF677 github地址:https://github.com/lxr1907/slot-on-ethereum pragma solidity ^0.4.18; contract LxrContract{ //18 dec

以太坊代币与账户交易

以太的单位 以太币的最小单位是Wei.Wei是一个非常小的单位,1Ether= 1018 Wei,和无限可分也差不了多少了.除了基本单位Wei,为了使用方便还有其他的单位,他们的关系如下: Kwei = 103  Wei Mwei = 106  Wei Gwei = 109  Wei Microether = 1012  Wei Milliether = 1015  Wei Ether / SCC = 1018 Wei 我们一般记住wei , Gwei=109wei,Ether = 1018we