千家信息网

如何用solidity开发代币合约

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"如何用solidity开发代币合约"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!以太
千家信息网最后更新 2026年11月03日如何用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可以被任何人(拥有一定数量的代币)调用,发送一些币给其他人。注意,当你通过该合约发送一些代币到某个地址,在区块链浏览器中查询该地址将什么也看不到。因为发送代币导致的余额变化只存储在该代币合约的数据存储中。通过事件我们可以很容易创建一个可以追踪你的新币交易和余额的"区块链浏览器"。

"如何用solidity开发代币合约"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

合约 函数 代码 变量 代币 数字 状态 开发 事件 区块 类型 地址 数据 以太 存储 例子 关键 关键字 查询 生成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技股互联网 科技企业和互联网企业 互联网科技集团 米客互联网科技 盛创互联网科技有限公司 互联网科技生活的内容 衡水科技产业互联网平台 太原新华互联网科技学校怎么样 玖二柒互联网科技公司待遇 隆华科技工业互联网 中盈科技互联网信息有限公司 江阴互联网智能科技产品进口 移动互联网年度科技创新 领航科技大厦互联网公司 有人说阿里系是互联网科技企业 35岁以上互联网科技行业 普陀区互联网教育科技管理办法 国产互联网科技公司 互联网科技对化妆品行业 科技互联网企业在行动 互联网是不是新科技 互联网科技公司怎么样 互联网科技英文翻译 互联网科技实习生岗位职责 电子科技大学互联网创业大赛 洛阳共同富裕互联网科技有限公司 玉溪新华互联网科技好不好 互联网科技如何创业 南博望互联网科技有限公司 互联网相关科技技术
0