主页 > imtoken钱包苹果手机怎么下载 > 使用以太坊智能合约创建代币教程

使用以太坊智能合约创建代币教程

本文介绍了如何使用以太坊智能合约创建您自己的代币。

本文来源于以太坊官网资料。 本文是作者阅读资料并亲自试验后所写的中文版资料。 仅供初学者参考。

本文并非原文的完整翻译。 主要是作者消化后整理出来的文档。 如需阅读原文,请直接访问原文地址。

1. 什么是代币?

代币是使用以太坊智能合约编写的数字货币。 程序员可以通过编写智能合约代码来创建一种新的数字货币。

你可以实现的功能:

基本技能:

-创建数字货币并设置货币名称、货币总量、货币图标等基本参数。

- 创建货币交易功能。 实现不同用户之间的货币转移。

上面是基本功能,已经可以实现基本的代表交换,下面是高级功能,可以实现更复杂的应用。

高级功能:

- 创建一个货币管理器。 虽然区块链是去中心化的,但它可以实现合约管理器,这是许多应用程序所需要的。

- 实现数字货币的黑白名单。 通过设置黑白名单可以冻结某些账户。 资产仍在账户中,但不允许交易。

-实现货币发行。 就像美联储印钞一样,作为货币的创造者,你也可以实现增发货币的功能,可以在原有货币总量的基础上增发钞票。 (想想就很激动)

- 实现挖矿。 比特币和以太坊的挖矿机制非常有名,矿工、矿机、矿池的概念大家都耳熟能详。 你可以用自己的货币实现挖矿机制,并奖励用户一些用于挖矿的代币。 我还没有想到这个功能有什么用,但是阅读这部分内容有助于理解比特币和以太坊的挖矿机制。

- 实现代币与其他货币的自动兑换。 您可以用自己的货币实现代币与其他数字货币的兑换机制。 这很令人兴奋,你可以像银行一样收取交易费用。 例如买入代币的价格是1ETH,卖出代币的价格是0.8ETH,也就是说你可以对每笔代币的流入和流出收取0.2ETH的交易手续费。 你兴奋吗,前提是你想忽悠大家用你的代币。

- 实现自动补气。 以太坊中的交易需要 gas(实际上是 eth)。 为了解决部分用户没有ETH只有token的情况,可以设计自动补充gas的功能。 此功能将使您的代币更有用。 (用的人越多,手续费越多,呵呵)

以上是以太坊官方教程中提到的功能。 通过学习如何编写这些函数,您将学习到基本的智能合约编程方法,并能够开发出更多样的函数。

下面我将介绍如何编写智能合约的代码来实现上述功能。

2.实现代币的基本功能

从简单开始,首先实现一个包含基本功能的令牌。 只需实现令牌定义和交易功能。

实现代币的过程就是为智能合约编写代码。 你可以将智能合约理解为一个程序,类似于 C 和 C++。 别怕,这门语言简单易懂,看一会儿就知道了。

以下是完整代码,直接部署即可。

------------------------------------ 我是分界线,不要复制我- --------------------------------------------

/* contract 类似于C++中的类 */contract MyToken {/* 设置一个数组存储每个账户的代币信息 */mapping (address => uint256) public balanceOf;/* 设置变量 *//* name 代币名称 *//* symbol 代币图标 *//* decimals 代币小数点位数 */string public name;string public symbol;uint8 public decimals;/* event事件,它的作用是提醒客户端发生了这个事件,你会注意到钱包有时候会在右下角弹出信息 */event Transfer(address indexed from, address indexed to, uint256 value);/* 下面这个类似于C++的构造函数,接收用户输入,实现代币的初始化 */function MyToken(uint256 initialSupply, string tokenName, uint8 decimalUnits, string tokenSymbol) {balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokensname = tokenName; // Set the name for display purposessymbol = tokenSymbol; // Set the symbol for display purposesdecimals = decimalUnits; // Amount of decimals for display purposes}/* 代币交易的函数 */function transfer(address _to, uint256 _value) {/* 检查发送方有没有足够的代币 */if (balanceOf[msg.sender] < _value || balanceOf[_to] + _value < balanceOf[_to])throw;/* 交易过程,发送方减去代币,接收方增加代币 */balanceOf[msg.sender] -= _value;balanceOf[_to] += _value;/* 提醒客户端发生了交易事件 */Transfer(msg.sender, _to, _value);}}

------------------------------------ 我是分界线,不要复制我- --------------------------------------------

下面是部署方法。 我使用以太坊钱包 mist 来部署合约。

为了省钱,我使用以太坊测试网络。 测试网可以用以太坊钱包挖矿。 挖矿难度不高。 我最多挖了20个,做实验够用了。 如果你真的不会挖币,请在下面留下你的地址,我可以补贴你1个以太坊做实验(是测试网的以太坊)。

还有很多其他的方法,这里就不一一赘述了。 我认为初学者使用mist是最简单的。 下面是部署的界面。

sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币_sitehqz.com 以太坊代币交易

该页面为以太坊钱包的“CONTRACTS”页面,点击“DEPLAY NEW CONTRACT”按钮即可看到。

上图是将以太币打入合约。 目前不用设置,保持为0即可。图中左侧是放置代码的地方,将复制的代码粘贴到这里即可。 右侧红圈内可选择合约,请点击下拉框选择“我的代币”。 选择后会出现如图所示,这里可以输入代币总数(Initial supply)、代币名称(Token name)、小数位数(Decimal units)和代币符号代币(代币符号)。 可以按图填,也可以试着随便填一下,了解一下用途。

填写完成后,点击最下方的“DEPLOY”按钮。 如果成功,可以在钱包主页看到合约正在等待验证。 如果失败,会提示原因,请检查输入。

如果您的网络正常,通常合约会在 1 分钟内完成验证。 这是我们在以太坊钱包的“CONTRACTS”页面上创建的代币 TESTCOIN。

sitehqz.com 以太坊代币交易_以太坊有多少种代币_sitebitecoin.com 以太坊的代币开发

sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币_sitehqz.com 以太坊代币交易

最上面的红色图标是我创建的token,点击进入token的管理页面。

sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币_sitehqz.com 以太坊代币交易

这张图是我创建的token的管理页面。 在该页面可以查看合约持有的代币数量、每个用户持有的代币数量、执行代币交易等。

图中左侧可以查看代币的基本信息、名称、小数点、符号。

在图中左侧红色位置,可以查看指定用户持有的代币数量。 只需在红圈位置填写指定用户的地址,即可自动显示。

图中右边是token的交易功能,可以进行token交易。

“Select function”,这个选择传递函数

“地址”,这是指用户接收代币的地址

“价值”,发送的代币数量

“Execute from”,这个地方可以选择发件人的地址。

单击“执行”按钮发送。

收币人想要查看代币,只需要在“CONTRACTS”页面的“观看代币”中输入对应的代币合约地址即可。

至此,已经实现了一个具有基本功能的token。 该代币可用于积分管理、简单交易。

以后实现更多的功能后,可以有更多的用途。

3.实现token的高级功能

接下来,我们将在上面添加以下高级功能:

1.创建货币经理。 虽然区块链是去中心化的,但它可以实现合约管理器,这是许多应用程序所需要的。

2.实现增发货币。 就像美联储印钞一样,作为货币的创造者,你也可以实现增发货币的功能,可以在原有货币总量的基础上增发钞票。 (想想就很激动)

3、实现数字货币的黑白名单。 通过设置黑白名单可以冻结某些账户。 资产仍在账户中,但不允许交易。

4.实现代币与其他货币的自动兑换。 您可以用自己的货币实现代币与其他数字货币的兑换机制。 这很令人兴奋,你可以像银行一样收取交易费用。 例如买入代币的价格是1ETH,卖出代币的价格是0.8ETH,也就是说你可以对每笔代币的流入和流出收取0.2ETH的交易手续费。 你兴奋吗,前提是你想忽悠大家用你的代币。

5、实现自动补气。 以太坊中的交易需要 gas(实际上是 eth)。 为了解决部分用户没有ETH只有token的情况,可以设计自动补充gas的功能。 此功能将使您的代币更有用。 (用的人越多,手续费越多,呵呵)

我介绍的思路是这样的:

首先给出全部代码。 这段代码包含了上面提到的所有功能,可以直接部署。

然后,根据功能介绍代码和相关知识。

以下为代码,具备所有高级功能,可直接部署在以太坊钱包mist中。 具体方法可以参考之前的文章。

------------------------------------ 我是分界线,不要复制我- --------------------------------------------

/* 建立一个新合约,类似于C++中的类,实现合约管理者的功能 */contract owned {    address public owner;    function owned() {        owner = msg.sender;    }    modifier onlyOwner {        if (msg.sender != owner) throw;        _    }        /* 管理者的权限可以转移 */    function transferOwnership(address newOwner) onlyOwner {        owner = newOwner;    }}/* 注意“contract MyToken is owned”,这类似于C++中的派生类的概念 */contract MyToken is owned{    /* Public variables of the token */    string public standard = 'Token 0.1';    string public name;    string public symbol;    uint8 public decimals;    uint256 public totalSupply;        uint256 public sellPrice;        uint256 public buyPrice;        uint minBalanceForAccounts;                                         //threshold amount    /* This creates an array with all balances */    mapping (address => uint256) public balanceOf;        mapping (address => bool) public frozenAccount;    /* This generates a public event on the blockchain that will notify clients */    event Transfer(address indexed from, address indexed to, uint256 value);        event FrozenFunds(address target, bool frozen);    /* Initializes contract with initial supply tokens to the creator of the contract */    function MyToken(    uint256 initialSupply,    string tokenName,    uint8 decimalUnits,    string tokenSymbol,    address centralMinter    ) {    if(centralMinter != 0 ) owner = msg.sender;        balanceOf[msg.sender] = initialSupply;              // Give the creator all initial tokens        totalSupply = initialSupply;                        // Update total supply        name = tokenName;                                   // Set the name for display purposes        symbol = tokenSymbol;                               // Set the symbol for display purposes        decimals = decimalUnits;                            // Amount of decimals for display purposes    }    /* 代币转移的函数 */    function transfer(address _to, uint256 _value) {            if (frozenAccount[msg.sender]) throw;        if (balanceOf[msg.sender] < _value) throw;           // Check if the sender has enough        if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows        if(msg.sender.balance

------------------------------------ 我是分界线,不要复制我- --------------------------------------------

接下来我们分别介绍一下功能

3.1 创建货币管理器。

虽然区块链是去中心化的,但它可以实现合约管理器,这是许多应用程序所需要的。 您可以通过设置为智能合约添加管理员。

添加的过程可以利用继承的概念。

sitehqz.com 以太坊代币交易_sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币

3.1.1 代码分析

首先定义一个父类

contract owned {address public owner;function owned() {owner = msg.sender;}

上面的代码定义了一个变量“owner”,这个变量的类型是address,就是用来存放token的manager。

owned()类似于C++中的构造函数,其作用是为owner赋值。

接下来定义一个修饰符(修饰标志),可以理解为函数的附属条件。 这个条件的内容是如果发送者不是所有者(管理者)则跳出。 起到身份识别作用。

modifier onlyOwner {if (msg.sender != owner) throw;_}

然后定义一个transferOwnership函数,用于传递管理者的身份。

function transferOwnership(address newOwner) onlyOwner {owner = newOwner;}

请注意,transferOwnership 后跟“onlyOwner”。 所以这个功能的前提是发送者必须是所有者。

然后修改MyToken。

合约 MyToken 拥有{

//地址变量centralMinter被添加到mytoken中,其中有一个输入位置。

function MyToken(uint256 initialSupply,string tokenName,uint8 decimalUnits,string tokenSymbol,address centralMinter) {if(centraMinter != 0) owner=msg.sender;

在上面的if子句中,只要输入的地址不为0,所有者就是发送者,所以这里输入什么都无所谓。 目前看来这个 if 子句没有任何用处。

3.1.2 代码功能测试

实验内容:

1.创建一个合约,将合约的manager设置为账户1。

实验成功了,实验过程也很简单,就不多说了。

2. 将经理从账户 1 转移到账户 2。

实验成功了。 转账成功后,您可以在代币页面查看“OWNER”是否发生变化。

sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币_sitehqz.com 以太坊代币交易

3.2 实现增发货币

就像美联储印钞一样,作为货币的创造者,你也可以实现增发货币的功能,可以在原有货币总量的基础上增发钞票。 (想想就很激动)。

可以实现货币发行。 通过代码,管理者可以向特定人员发放额外的代币。 这个token是凭空产生的,会导致token总量发生变化。

该函数可以实现挖矿功能。 当矿工达到某个目标时,管理者可以通过调用函数将一定数量的资金转移给矿工。

3.2.1 代码分析

1 function mintToken(address target, uint256 mintedAmount) onlyOwner {2 balanceOf[target] += mintedAmount;3 totalSupply += mintedAmount;4 Transfer(0, owner, mintedAmount);5 Transfer(owner, target, mintedAmount);6 }

第二句代码增加了指定目标的token数量;

第三句代码增加相应数量的代币总量;

第4句和第5句代码的含义只是提醒客户发生了此类交易。

经验:

所有公共参数都可以在钱包中查看;

以太坊有多少种代币_sitehqz.com 以太坊代币交易_sitebitecoin.com 以太坊的代币开发

所有功能都可以在钱包中调用

3.2.2 代码功能测试

设计实验:

1. 向指定地址增发代币。

功能实现成功后,管理员可以向指定地址增发货币。

2.版税管理器调用增发函数

失败。 非经理人员不能增发股份。

3.3 实现数字货币的黑白名单

通过设置黑白名单可以冻结某些账户。 资产仍在账户中,但不允许交易。

本文演示设置黑名单,即黑名单中的用户不能转账。

3.3.1 代码分析

mapping (address => bool) public frozenAccount;event FrozenFunds(address target, bool frozen);function freezeAccount(address target, bool freeze) onlyOwner {frozenAccount[target] = freeze;FrozenFunds(target, freeze);}

申请一个数组“freezeAccount”,存放被冻结账户的地址和冻结信息

申请事件“FrozenFunds”以提醒客户发生冻结

创建函数“freezeAccount”,设置冻结数组对应位置冻结,

转账添加冻结码

函数传输(address_to,uint256_value)

{ 如果 (frozenAccount[msg.sender]) 抛出;

假设账户被冻结,转账函数跳出。

3.3.2 代码功能测试

设置实验:

1.正常情况下可以交易

实验成功

2、冻结后不可交易

实验成功

3.只有管理员可以冻结。

实验成功

4.你能把自己冷冻起来吗

实验成功了。 经理本身可以被冻结。

5.是否可以设置为0,设置0是否表示解锁

实验成功了。 设置为 0 解锁。

此图为token管理页面,在address中输入地址,可以查看是否被冻结,NO表示未冻结,YES表示冻结。

sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币_sitehqz.com 以太坊代币交易

sitehqz.com 以太坊代币交易_sitebitecoin.com 以太坊的代币开发_以太坊有多少种代币

3.4 实现代币与其他货币的自动兑换。

您可以用自己的货币实现代币与其他数字货币的兑换机制。 这很令人兴奋,你可以像银行一样收取交易费用。

实现token和数字货币兑换的代码

3.4.1 代码分析

function buy() returns (uint amount){amount = msg.value / buyPrice; // 这个value是用户输入的购买代币支付的以太币数目。amount是根据汇率算出来的代币数目if (balanceOf[this] < amount) throw; // checks if it has enough to sellbalanceOf[msg.sender] += amount; // 购买者增加代币balanceOf[this] -= amount; // 合约减少代币Transfer(this, msg.sender, amount); // execute an event reflecting the changereturn amount; // ends function and returns}function sell(uint amount) returns (uint revenue){if (balanceOf[msg.sender] < amount ) throw; // checks if the sender has enough to sellbalanceOf[this] += amount; // 合约增加代币balanceOf[msg.sender] -= amount; // 出售者减少代币revenue = amount * sellPrice; // amount是用户数输入的出售代币的数量msg.sender.send(revenue); // 用户获得因为输出代币得到的以太币Transfer(msg.sender, this, amount); // executes an event reflecting on the changereturn revenue; // ends function and returns}

这里的代码实现了一个简单的交易。 即合约本身充当中央银行,用户和合约做生意。 用户从合约购买代币以太坊有多少种代币,用户向合约出售代币。

注意:这里的代码没有实现检测功能,即合约中可能没有token,合约中也没有ether,导致交易异常。 此代码未处理。 实际使用中,请自行添加检测代码。

/* 设置代币买卖价格的函数 */

function setPrices(uint256 newSellPrice, uint256 newBuyPrice) onlyOwner {sellPrice = newSellPrice;buyPrice = newBuyPrice;}

这个函数是设置token的汇率。 包括买入汇率buyPrice和卖出汇率sellPrice。 在我们的实验中,为了简单起见,我们设置buyPrice=sellPrice=0.01ETH。 当然,这个比例是自由设定的。 在实践中,你可以设计买入代币buyPrice的价格为1ETH,卖出代币sellPrice的价格为0.8ETH,也就是说你可以对每笔代币流入和流出收取0.2ETH的交易手续费。 你兴奋吗,前提是你想忽悠大家用你的代币。

3.4.2 代码功能测试

设计实验:

1.调用setPrices函数设计汇率。

实验成功了。 注意智能合约汇率的单位是wei,1以太ETH=10的wei的18次方。

我们设计buyPrice=sellPrice=0.01ETH=100000000000000000(10的16次方)

设置价格也是 1 笔交易。每次价格变化都写入区块链

2、账户1买了200个代币,猜测购买不成功

实验没有成功。 说明不能买,因为合约没有token,只有eth

3、账户1卖出100个代币,猜测成功,账户1获得1ETH

实验成功了。 账户 1 获得 1 个代币,销售成功。 目前显示gf1合约有100个代币和9个eth。

4、账户2卖出800个代币,猜测成功,获得8ETH,合约ETH为1

实验成功,账户2获得8个代币,售卖成功。 目前显示gf1合约有900个代币和1个eth。

5. 账户 2 购买 500 个代币。 如果猜测成功,将收取 5ETH。

实验成功,账户2获得500个代币,购买成功。 目前显示gf1合约有400个代币和6个eth。

6. 修改价格,卖到10的17次方。这意味着代币价格升值了。 只有 50 个代币可以兑换 5ETH。

实验成功了。 修改了售价。

7、账户1卖出60个代币以太坊有多少种代币,收取6ETH,合约还有0ETH,460个代币。

实验成功了。 交易已经完成。 目前显示 gf1 合约有 460 个代币和 0 个 eth。

卖出价设置为 1000000000000000000,这意味着账户 2 可以用 60 个代币获得 6ETH。 合同破裂,无法支付剩余的代币。

注意此时合约已经破产,合约没有ETH,但是用户还有代币。 合同不能兑现。

8. 账户2卖出了100个代币,但猜测未成功。

实验成功了。 但是交易成功,账户2减100代币,gf1合约增加100代币,账户2却没有得到对应的eth。

猜测,可能的原因是函数msg.sender.send(revenue); 执行失败。

sitebitecoin.com 以太坊的代币开发_sitehqz.com 以太坊代币交易_以太坊有多少种代币

9.重置买卖价格,高价买入代币,看之前的欠款会不会还清。 估计不会赔这是一个漏洞,可以通过修改售价来修改。 窃取资金。 普通用户没有权限。

实验成功,确实没有补交。 账户 1 花费 5ETH 购买了 50 个代币。

11. 账户 2 卖出 50 个代币,获得合约中剩余的 5 个 ETH。

实验成功了。

以后如果账户1和账户2再次卖出代币,将无法获得ETH。

** 注意:这和白帽黑客目前在 DAO 上做的一样,合约本身没有钱了。 代币失去价值。 目前,没有机制来检测是否有足够的钱来支持代币兑换。 **

实际的交易系统需要考虑这个问题。 至少有提示。 这个问题出现在当前的 DAO 中,DAO 中的以太币已经被白猫黑客转移到了别处。 现在如果你通过拆分来交换 DAO 币,你将不会得到 Ether 币。 造成财务损失。 具体内容请参考。

3.5实现自动补气。 以太坊中的交易需要 gas(实际上是 eth)

为了解决部分用户没有ETH只有token的情况,可以设计自动补充gas的功能。 此功能将使您的代币更有用。 (用的人越多,手续费越多,呵呵)

以太坊中的每笔交易都需要支付一定的交易费用(gas、eth)。 在某些情况下,客户不应与 eth 打交道。

因此,可以通过代码实现代币与eth的自动兑换。 当用户的ETH比较少时,会自动置换一部分代币,以获得足够的eth进行交易。

对于用户来说,他们只需要和代币打交道,而不知道背后的ETH。

3.5.1 代码分析

uint minBalanceForAccounts;//注意,这个参数是一个私有变量,意味着钱包里看不见。function setMinBalance(uint minimumBalanceInFinney) onlyOwner {minBalanceForAccounts = minimumBalanceInFinney * 1 finney;}

申请一个变量 minBalanceForAccounts 来存储自动换气的阈值

创建一个设置阈值的函数

/* Send coins */function transfer(address _to, uint256 _value) {...if(msg.sender.balance

在交易函数中,会提前进行校验,如果账户的eth不够阈值,就会执行交易。

另一种方法是发送方检查收款人是否有足够的 ETH。 如果没有,发送方交换部分自己的代币,将获得的ETH发送给收款人(这种方式是为收款人服务的,收款人不需要与ETH和GAS打交道)。

/* Send coins */function transfer(address _to, uint256 _value) {...if(_to.balance

3.5.2 代码功能测试

设计实验:

1. 账户3向账户1转账,账户3没有eth。 检查是否执行了自动交换。

实验失败。 错误原因找到了,价格还没有设置好。

先定好价格

1 个代币 = 1000000000000000(16 个零)

即使价格定了,也仍然无法执行。 原因是账户 3 目前没有 ETH,所以没有足够的 gas 来支付这笔交易。 所以,账户 3 必须有足够的 ETH 来执行交易。

重新设计实验,从账户1转0.005ETH到账户3,成功

实验成功,账户自动兑换了4个代币,获得0.004个ETH。 目前ETH总量为0.006ETH。

2、账户1向账户3转账,查看账户3的变化,前提是先将账户3的ETH清零。

实验成功了。 发现该账户已兑换5个代币并发送至账户3。

有趣的是,收款人收到的不是0.005,而是0.0044,应该从手续费中扣除。

至此,所有高级功能都已实现。

以太坊官网的TOKEN教程也实现了挖矿功能。 有兴趣的可以直接阅读原文。

token教程就写到这里了,上面的实验我都在自己的电脑上进行过。 欢迎交流。