超零协议(SERO)智能合约教程——发行匿名Token实战
一. SERO的匿名Token能做什么
在目前的区块链公链中,发行匿名Token是SERO的独门绝技,只此一家,别无分号。那么我们能用这门绝技来做一些什么很酷的事情呢?
利用SERO的匿名Token机制,你可以做到这样的事情:
- 向客户承诺你的Token具有和SERO币同等的匿名特性。
- 业务成长后安全的扩展你的服务功能,而不用担心之前的智能合约没有提供某些接口。
- 能用智能合约编写去中心化交易所,实现SERO上各种Token的兑换。
- 向公众只公开部分你的运营信息。
在Beta-Release版本发布后你还可以
- 让访问你业务的客户用你发行的Token缴纳SERO的手续费。
- 让你业务具有暗标的公正性。
SERO通过发行匿名Ticket资产,可以提供更加让人惊讶的功能,详细的教程可以等待《发行匿名Ticket实战》。下面我们从一个假设的例子出发,看一看,如何在SERO上发行匿名的Token资产。
二. 场景 Alice是一个公益组织的成员,她为了使贫困地区的失学儿童能够读书,打算开展一个募捐活动。公益活动的运作机制往往非常的复杂,下面几点是她非常关注的:
- 募集到的钱都能真实的用在需要捐助的孩子身上,而不是被挪作它用。
- 有些真正的慈善人士,捐助就是他们的主要目的,并不想公开他的捐助金额和身份。
- 她希望这种关怀具有传递效应,让更多的人非常容易的参与进来,共同分担成本,帮助这些失学儿童。
明日花朵
的区块链应用方案。这个方案是筹集善款与使用资金分离。当然,当她准备开始开发智能合约时,她发现,目前唯一的一个能够满足这样的需求,并且已经落地的公链,就只有SERO协议了。Alice的方案是这样的
文章图片
SERO智能合约教程——发行匿名Token实战 她要开发一个智能合约,这个智能合约提供两种Token,分别是
Assisted Token
和Helper Token
,这两种Token必须同比例发行(即购买了多少Heper Token
,就必须对应的生成多少Assisted Token
)。Assisted Token好了,Alice有了这个可行的方案,虽然它不够完美,但是不妨碍我们将它开发出来。本文主要借助发行
采用常规方式进行记录的,全程受到银行和公众监管,用来跟踪捐助儿童的情况。Assisted Token根据活动开展的需求和情况进行统一分配,所有最后拿到Token进行失学捐助申请资金的时候,必须完整的汇报资金运作的情况,并记录在区块链上,受到公众的监管。
Helper Token
用匿名方式来发行,用来进行慈善筹资。购买Helper Token
的人则可以将Token交易给其他的慈善捐助者,以分担这项行动的成本,同时传递这种温暖的行为。这种行为造成的交易则应该享受相应的社会回报。Helper Token
的交易也不会透漏捐助者的任何信息,因为它是匿名的。
Helper Token
的场景说明如何在SERO上发行匿名的Token资产。本文着重讲述匿名Token的开发过程,Assisted Token是常规的Token发行,由于SERO的智能合约与以太坊是兼容的,公开资产的发行过程与以太坊是一致的,可以参考以太坊发行ERC20代币的方法。三. 发行匿名Token的步骤
你可以跟着我的步骤来发行一个你自己的匿名Token,如果对一些基本概念不熟悉,建议重温一下《发行匿名Token原理》这篇文章。第一步. 准备工作
另外,因为SERO发布智能合约的主要流程与以太坊是一致的。本文重点将讲述不同之处。
SOLIDITY语言
文章图片
SERO智能合约教程——发行匿名Token实战 SERO采用solidity的编程语言进行智能合约的开发,目前兼容v0.5.0及以下的版本。如果对语法有疑问可以参考《SOLIDITY官方手册》。
SERO智能合约开发环境
文章图片
SERO智能合约教程——发行匿名Token实战 我们建议你采用SERO官方定制的SOLIDITY IDE进行SERO智能合约的开发、编译。目前在它上面集成了发行匿名智能合约最基本的API(serointerface.sol)、一个发行匿名token的例子(token_test.sol),和一些必须的自动化工作。后续我们会加入匿名资产调试功能。
你可以通过链接:http://remix.web.sero.cash打开SERO的智能合约开发环境。
请注意,必须用非加密的方式(http://),而不是(https://)的方式打开链接才能正常运行。全节点服务程序(gero)或者SERO客户端钱包(Wallet) 虽然SERO的客户端钱包也可以发布智能合约,但是我们强烈建议你采用全节点服务程序来发布智能合约,这样你可以获得更多的信息和灵活性。
本文采用gero来说明智能合约的发布过程,有关gero的编译和安装,请参考《SERO轻松入门》以及《SERO挖矿教程》
你可以在这个页面获得最新的gero源码和编译好的包
https://github.com/sero-cash/go-sero/releases
文章图片
SERO智能合约教程——发行匿名Token实战 关于如何用钱包发布智能合约,请参考《SERO钱包使用说明》
你可以在这个页面获得最新的wallet的源码和编译好的安装包
https://github.com/sero-cash/wallet/releases
文章图片
SERO智能合约教程——发行匿名Token实战 第二步. 确定币名
现在我们要发行Helper Token,我们先为这种Token取个名字,比如叫做
"TFHCOIN"
意为"明日之花捐助者币"
(Tomorrow Flowers Helper Coin)。需要注意的是,币名需要通过SERO提供的基础接口注册到SERO共识中,而且它必须满足下面的条件:
因此,你在重复这个例子的时候,可以采用SERO的Dev模式来确保你是第一个使用这个名字的开发者。
- 不区分大小写
- 在全局上不能重复
- 不能超过24个字符
- 只能采用大写英文字母
A-Z
和下划线_
第三步. 在SERO的solidity IDE上编辑智能合约
1. SERO基础接口 SERO IDE的左侧有个名为
serointerface.sol
的文件,这个文件中有个名为SeroInterface
的基础合约。需要发行匿名Token就必须继承这个合约。本文中这个合约主要用到的接口是这些:pragma solidity ^0.4.25;
contract SeroInterface {function sero_issueToken(
uint256 _total,
string memory _currency
) internal returns (bool success) {...}function sero_balanceOf(
string memory _currency
) internal returns (uint256 amount) {...}function sero_send_token(
address _receiver,
string memory _currency,
uint256 _amount
) internal returns (bool success){...}...}
-
sero_issueToken
有两个作用,第一是注册一个币名_currency
,第二是生成_total
个对应的token给智能合约账户。
注意: 当币名已经存在的前提下,只有创建该币名的智能合约能够再次调用次这个方法增发Token。
-
sero_balanceOf
作用是智能合约账户持有币名为_currency
的Token余额,
注意: 这里的
_currency
可以不是本智能合约发行的币名,甚至可以是SERO
。也就是说智能合约原生就可以接受任何和普通账户一样的资产。
-
sero_send_token
作用是将智能合约账户中,币名为_currency
的_amount
个Token,转账给地址_receiver
。
注意: 这里的
_receiver
可以是普通账户也可以是智能合约,如果是普通账户,只支持暂存地址PKr
。如果你向任何公钥地址PK
转账,Token将转到一个没有人能再次使用的账户中。
"TFHCOIN"
的智能合约TFHCoin.sol
// TFHCoin.
pragma solidity ^0.4.16;
import "./seroInterface.sol";
contract TFHCoin is SeroInterface {string private _currency="TFHCOIN";
address private _owner;
constructor()
public
{
_owner=msg.sender;
if(!sero_issueToken(
1000000000*10**9,
_currency
)){
require(false);
}
}function balanceOf()
public returns (uint256 amount)
{
return sero_balanceOf(_currency);
}function transfer(
address _to,
uint256 _value
)
public returns (bool success)
{
require(_owner==msg.sender);
return sero_send(_to,_currency,_value,'','');
}}
- 首先我们看看构造方法
constructor
,在方法体中,我们将创建者记为_owner
,并调用sero_issueToken
以 为精度发行10亿币名为TFHCOIN
的Token,返回值表示是否成功。如果不成功我们就回滚整个交易。
balanceOf
方法调用sero_balanceOf
查询当前智能合约所持有的TFHCOIN
的余额。
transfer
方法先判断调用者是不是_owner
,然后向暂存地址_to
转出_value
个TFHCOIN
。
注意:3. 编译_to
是暂存地址PKr
,如果使用公钥地址PK
,这笔Token将不会有任何账户能再次使用。
TFHCoin.sol
- 在IDE的右侧选择
TFHCOIN
智能合约,并点击旁边的Detail
按钮。
文章图片
SERO智能合约教程——发行匿名Token实战
- 在弹出框中找到
WEB3DEPLOY
旁边拷贝的按钮拷贝编译后的内容
文章图片
SERO智能合约教程——发行匿名Token实战
注意4. 运行gero后台以及命令行控制台TFHCOIN
的构造方法没有传入参数,如果有传入参数,你需要先将它拷贝到文本编辑器将构造方法的初始化参数设置好。
对于gero后台以及控制台的运行方法请参考《SERO轻松入门》以及《SERO挖矿教程》由于我们是采用Dev模式运行的gero,因此我们需要先创建一个账户,并为他准备一些SERO作为手续费用。
> alice_addr=personal.newAccount("1234")
"2yKtQ7rMHLn1dSSuAFvsi1s7NaLL1zkNysmMv4L51WCubgjHtMtKNwVsDdEMXXH1QvmWQgKTKcyUXBK2RUPoK7mo"
> sero.accounts
["2yKtQ7rMHLn1dSSuAFvsi1s7NaLL1zkNysmMv4L51WCubgjHtMtKNwVsDdEMXXH1QvmWQgKTKcyUXBK2RUPoK7mo"]
> miner.start();
admin.sleepBlocks(1);
miner.stop();
true
> sero.getBalance(alice_addr)
{
tkn: {
SERO: 24000000000000000000
}
}
5. 安装智能合约
- 然后我们将从IDE拷贝出来的编译后代码粘贴进控制台里面,并回车创建交易。
文章图片
SERO智能合约教程——发行匿名Token实战 智能合约的安装是附带在交易中进行的,交易创建之后可以查看这笔交易的地址。用此地址可在区块浏览器中查询到当前打包的状态。
> tfhcoin.transactionHash
"0x254bbefcbe0eaa3cb5a657377fd49b756880839a1bb69eaa006106a882055f09"
- 现在挖出一个区块打包这笔交易,确认成功即代表智能合约被成功安装了。
文章图片
SERO智能合约教程——发行匿名Token实战
安装成功后SERO控制台会返回智能合约地址和交易号
- 现在可以查看智能合约地址中的余额。
> sero.getBalance(tfhcoin.address)
{
tkn: {
TFHCOIN: 1000000000000000000
}
}
目前我们已经生成了以 为精度,数量是10亿,币名为
TFHCOIN
的Token。6. 向外发行
TFHCOIN
- 发行
TFHCOIN
的意思是,Alice和她的机构接受捐助者的捐助,并发给捐助者相应数量的TFHCOIN
,同时将收取的捐助的钱交由监管机构进行监管。
我们可以调用TFHCoin智能合约的
transfer
方法,实现将一定数量的TFHCoin发送给捐助者。
- 为此我们创建一个假的捐助者
helper_addr
来测试这个功能。
> helper_addr=personal.newAccount("1234")
"37NVgL22rksMLK6Euos9eoS2T7prRUrXKzMMXPYr4SfNCaiDgXfvbfe6SmD3EgfhRuZtPekop3BgwGRByWLSeRHg"
- 用
account[0]
给这个捐助者发出10个TFHCOIN
。
> tfhcoin.transfer(helper_addr,10*1000000000,{from:sero.accounts[0]})
"0xbd290e7c1385af11eb8bedbb3c03644dd27bcd7ae12604aac7e40d66597efee0"
> miner.start();
admin.sleepBlocks(1);
miner.stop();
true
> sero.getBalance(helper_addr)
{
tkn: {
TFHCOIN: 10000000000
}
}
> sero.getBalance(tfhcoin.address)
{
tkn: {
TFHCOIN: 999999990000000000
}
}
transfer
方法调用过之后,可以看到helper_addr的账户中多出了10个TFHCOIN
,而智能合约地址则少了10个TFHCOIN
。注意: 之前我们说到7. 捐助者卖出transfer
的第一个参数_to
需要用暂存地址PKr
。但是在SERO的控制台中,你可以直接使用对方的公钥地址PK
进行转账。SERO控制台会自动的用PK
生成PKr
来构造这笔交易。
TFHCOIN
使其他捐助者和他一起共同分担捐助份额
- 由于我们是Dev账户,
helper_addr
并没有充当交易费的SERO
币,因此主账户先转10个SERO
币给helper_addr
。
> sero.sendTransaction({from:alice_addr,to:helper_addr,value:web3.toTa(10)})
"0x9a5fd4f155254483f62a0cd85341ef8942e8a433b1be903a646740a8debb636f"
> miner.start();
admin.sleepBlocks(1);
miner.stop();
true
> sero.getBalance(helper_addr)
{
tkn: {
SERO: 10000000000000000000,
TFHCOIN: 10000000000
}
}
我们先来看看这笔SERO交易的构成
> sero.getTransaction("0x9a5fd4f155254483f62a0cd85341ef8942e8a433b1be903a646740a8debb636f")
{
blockHash: "0x937ddb...1f6120",
blockNumber: 7,
gas: 90000,
gasPrice: 1000000000,
hash: "0x9a5fd4f...b636f",
input: "0x",
nonce: 0,
stx: {
Bcr: "0x7b309...0f617",
Bsign: "0xd38f8a...e2705",
Desc_O_Ins: [],
Desc_O_Outs: [],
Desc_Z_Ins: [{
Anchor: "0x89ef81...33e2e99",
AssetCM: "0x795c4...11720",
Nil: "0x986d5...32afdf",
Proof: "0x03687c...d0aefc21c",
Trace: "0x5abf87...04006"
}],
Desc_Z_Outs: [
{
AssetCM: "0x1eee25e...da8816",
OutCM: "0x25773...c164ba9",
PKr: "0x5e4f8b...ec6902",
Proof: "0x0215c...6a526"
},
...
],
Ehash: "0xd8483...14a4",
Fee: "90000000000000",
From: "0x568ec...bfb5dd07",
Sign: "0x95f35...f8b600"
},
to: null,
transactionIndex: 0,
value: 0
}
是不是没有任何泄漏出来的信息,不知来源,不知去处,不知金额!
- 我们创建一个假的其他捐助者
other_helper_addr
接收helper_addr
的TFHCOIN
。
> other_helper_addr=personal.newAccount("1234")
"15B2TPeRdE6GwKsE2V7sprk3yYZXuTVaGMGNXZZAUUHRH3U5pW59BZWhXhAud2a8zFxPp9JRBz4akpHwoLx99No"
- 现在
helper_addr
可以采用匿名的方式转5个TFHCOIN
给other_helper_addr
> sero.sendTransaction(
{from:helper_addr,to:other_helper_addr,value:5*1000000000,cy:"TFHCOIN"}
)
"0x7024f426f376d188b6980b720d44104fe3f908d25d0d53c3f7e130f30f6d9765"
> miner.start();
admin.sleepBlocks(1);
miner.stop();
true
> sero.getBalance(helper_addr)
{
tkn: {
SERO: 9999975000000000000,
TFHCOIN: 5000000000
}
}
> sero.getBalance(other_helper_addr)
{
tkn: {
TFHCOIN: 5000000000
}
}
- 我们注意两个个事情:
> *个人给个人发送`TFHCOIN`采用的是与发送`SERO`相同的方式,即SERO的原生转账机制,而不是智能合约`TFHCoin`的方法`transfer`。这说明`TFHCOIN`确实与`SERO`是平等存在在用户账户中的。 > *在交易参数中多出一个币名`cy`,其值是`"TFHCOIN"`。
- 然后我们再来看这笔交易的详情:
> sero.getTransaction(
"0x7024f426f376d188b6980b720d44104fe3f908d25d0d53c3f7e130f30f6d9765"
)
{
blockHash: "0x735bb...17c3a",
blockNumber: 10,
gas: 90000,
gasPrice: 1000000000,
hash: "0x7024f...d9765",
input: "0x",
nonce: 0,
stx: {
Bcr: "0x85247...d8a714",
Bsign: "0x52013f...6df801",
Desc_O_Ins: [],
Desc_O_Outs: [],
Desc_Z_Ins: [
{
Anchor: "0xb0aaddf...d856d06",
AssetCM: "0x2d3cc...89cf62d",
Nil: "0x30da...bcee20",
Proof: "0x025eed...da7031b",
Trace: "0x811f...90b10b"
},
...
],
Desc_Z_Outs: [
{
AssetCM: "0xac8f2...e11c3ad",
OutCM: "0x0a586e...13e2486",
PKr: "0x875808...14d1c10",
Proof: "0x036b46...8d100e"
},
...
],
Ehash: "0xf125e7...4809768",
Fee: "90000000000000",
From: "0x807dc...d1bb80a",
Sign: "0xadf77...003702"
},
to: null,
transactionIndex: 0,
value: 0
}
是不是与前面看到的
SERO
转账一样,不知来源,不知去处,不知金额!四. 总结 【超零协议(SERO)智能合约教程——发行匿名Token实战】有了这个发行
TFHCOIN
的智能合约的原型,Alice可以在之后不断的丰富它以达到她的慈善目的。在智能合约被安装发行之后,由于发行的Token是直接进入了用户账户,而不是由智能合约代持,因此很容易写出另外一个智能合约来接收这种Token,为这种Token增加新的逻辑,就像为SERO
增加新逻辑一样简单。当然,Alice要完成她的事业需要很长的路要走,我们也希望SERO能够被用于正确的正义的事业上。
往期文章回顾 SERO | 智能合约教程——匿名Token发行原理
超零协议(SERO)轻松入门——基于CENTOS7
了解SERO更多信息 如果对SERO的原理和零知识证明算法感兴趣,可以在SERO的官网下载我们的白皮书。有任何建议也可以发送电子邮件到 gordon@sero.vip 咨询。
欢迎加入SERO的gitter社区,一起将SERO变得更好!
[官网] https://sero.cash](https://sero.cash)
[白皮书 V1.0.6] http://sero-media.s3-website-ap-southeast-1.amazonaws.com/Sero_ENG_V1.06.pdf
[SERO官方WIKI] https://wiki.sero.cash/zh/index.html?file=home-Home
[Twitter] https://twitter.com/SEROdotCASH
[Telegram] https://t.me/SeroOfficial
[Github] https://github.com/sero-cash/go-sero
[Gitter Community] https://gitter.im/sero-cash/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link
[SERO区块浏览器] https://explorer.web.sero.cash/blocks.html
[SERO智能合约编辑器] https://remix.web.sero.cash/
[SERO介绍视频] https://v.qq.com/x/page/s0792e921ok.html
[SERO vs Zcash加密速度对比] https://v.qq.com/x/page/r0796jotef8.html
推荐阅读
- 为什么你的路演总会超时()
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 日志打卡
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- 原生家庭之痛与超越
- BNC公链|BNC公链 | Eth2.0测试网Topaz已质押超100万枚ETH
- 89㎡挤出小三房,电视墙装的超好看!
- 八零后也已经老了
- Android超简单实现沉浸式状态栏
- 超级行动力第二次作业-行动大于学习的秘密