1. 社区分析
最近出来一个社群APP,其狂热繁忙让人瞠目结舌。辉哥基于社区体验,加入了几个微信群,结果发现根本看不过来,半天就有一堆消息,而且一个月来每天保持这样的热度。他们在讨论什么呢?他们要么就在区块链社群APP上输出文章的讨论/推广,要么就是为文章点赞赚钱。
打开币乎APP,结果发现热门板块随便一个文章都是上千的收入。显示的是人民币的价值,太有视觉冲击力了。看看这篇“数资本”讲区块链投资入门的文章,收入是4437元!好吧,原来作家是这么好当的,诺贝尔奖得主莫言知道这事会不会哭晕在厕所呢?
这些都是别人家的故事。辉哥参加了天平组织的“BH好文好报”社群,每天11:40时刻抽3分钟点赞一些热推文章,结果每日收益都在几十元以上。
2.持币分析
目前币乎通证KEY已经在几个交易所上市,主要在bibox和OTCBTC-可支付宝交易两个交易所。
2018年5月16日的价格为0.06元/KEY,按照1000亿的盘子总量,一个上线半年不到的APP,其市值已达60亿元!
币乎KEY在初始创设的时候,分配如下图组成:
经过几个月的运行,其持仓账户有所变化,点击查看最新变化:
具体分析:
[1] 激励池钱包地址和占比
0x69726ae4d92f48b97405d4e2785e4006c208a28a - 44.7303%
[2] 推广运营地址
0x05b472923a5cf155e2fae5e2d4468faf28e853f4 - 24.9621%
[3] 币乎基金会地址
0xbc1ab7f58a95cf307ba5ee18cf06b7ed0120da7a - 24.2600%
[4] 团队期权地址
: 0xb5b92093c60839db57ef79f431a93ab738e4e827 5.0000%
[5] 剩余账户
KEY的持币账户一共有9911个,非平台运营方账户为9908个账户,目前占比为0.3337%,流通币数33.37亿,当前流通市值为2.0亿。
从变化饼图可以看出,目前团队期权份额未有变动,币乎基金会和推广运营份额都有微量降低。
据说目前注册账号数已超过100万,那大部分账户还未取币套现,大家在场内玩的很HIGH吧。这反向验证了币乎APP社群的狂热。
经测试分析,币乎只把跟外部交易相关的数据上链了,APP内部投放的KEY并没有更新到链上。某个账号在APP上显示的金额为16092了,但是在链上查询,只有当时转账进入的4975个KEY。
3. 商业模式
3.1 产品定位
参考公开资料描述,币乎是为币圈量身定制的垂直社区平台。币乎通过代币激励的方式,使得用户的付出获得相应的回报。币乎是代币投资者的信息集散地,也是各个“币官方”与“币友”交流的平台。
根据币乎创始人鲁斌在币乎公开课的分享,他意识到现在很多代币投资者涌入到代币投资这个行业里来,但是大家对技术、金融并不很明白。尤其对技术白皮书,大家都看不懂。很多人看到以太坊一下子涨了一千倍,就红着眼睛进来了。但进来之后却不知道从哪着手,也不知道怎样判断项目,只能看宣传。但是即使是前一百名的项目,有很多也是不靠谱的。
他认为,这其实是情理之中的事情,跟100年前的股票市场一样。就如讲述美股的电影《华尔街之狼》里面,整个公司的人都在疯狂地给美国大妈们打电话:“你要不要买股票,这个股票现在才一分钱!”任何年轻的投资市场,都要经历从年轻蜕变到到成熟的过程。
而币乎就要在这个投资方式成长的过程中,普及区块链知识,引导社群用户学习知识,发现优质标的。
3.2 全体合伙人制度
鲁斌使用的表达是用户即利益相关方,辉哥个人认为还不够有印象力,就改为"全体合伙人制度"来阐述。现在很多公司流行全员合伙人制度,就是在该公司的全职员工均能分到一定的股票/期权,也能够享受企业成长带来的红利,以便提高工作积极性。比如华为,任老板敢于分利益,反而使华为在通信市场获得了更大的利益和市场份额。
有了区块链技术,这个"全员合伙人"可以变成”全体合伙人”了。什么意思呢?举例来说,现在很多互联网平台,比如淘宝,普通消费者只是一个利益贡献者,这个平台运营的好不好跟用户没有关系。但在有代币的平台上,每一个用户的角色都发生了转变:他们不单单是某个平台的用户,还持有了它的代币。这些代币一般都是有限的,使用这个平台的人数越多,代币的需求就会越旺盛,代币在市场上供需就会倾斜,就会涨价。所以这时候用户跟平台方,其实是站在同一边的。也就是说,在+互联网时代,通过使用互联网技术提升信息流通效率后,消费者培养了淘宝这个独角兽平台,但是这个受益主要被马云团队享受,创造了一个中国首富,平台的广大用户并没有得到平台增长红利的好处。但是,在+区块链时代,所有的用户都是平台的利益相关方,都是创业者。他们会随着这个平台的增长而一起受益,这个梦想的力量也就会更大。
代币对于互联网的意义,就像生物进化史上的神经系统对于生物的意义。在没有神经系统之前,所有的细胞只是简单的叠加,那么有了这神经系统之后,我们的社群、生态系统,就成了一个有机的整体,个体的利益和整体的利益就可以实现高度的一致。
对于平台方,有一个代币政策,就可以通过代币政策去激励用户,最终实现“人人为我,我为人人”的目标。
4. 产品分析
币乎的产品设计参考了 Reddit、微博和 Steem,最终的产品形态包含移动端的 APP(各大应用市场下载) 和 PC端的网页版。
4.1 币乎通证KEY的使用价值
具体文字描述参考币乎白皮书[白皮书好像被官网删除了,原因未明,需要者私信索要]
总结而言,KEY 代表币乎平台及其周边生态的功能的使用权。
- 奖励优秀帖子
- 奖励慧眼识珠
- 奖励社区管理员
- 收费看广告
- 代币销毁
- 付费私享群
- 付费问答活动
- 付费私信
- 获得特权
- 打赏
- 周围生态的使用权
- 用户即利益相关方(users-as-stakeholders)
4.2 币乎通证KEY的状态切换
【产品设计初心分析】
币乎首先希望能有更多的用户入场,所以初期设置了很高(14万KEY)的注册实名奖励,但是他又担心用户拿了币就跑。所以它设置了2个持有期,一个是领取还不是你的,要2年逐步每日登陆而释放出来;一个是解锁要30天周期,同时还不能享受点赞锁仓收益。韭菜是需要引导的,让用户更多的持有币,输出优质内容,才能享受平台发展真正的红利。
4.3 代币分配
KEY 的总量为 1000 亿,永不增发。 KEY 的分配由 4 部分组成:激励池、推广运营池、币乎基金会、团队期权。
激励池的 KEY 用于激励用户发布优秀内容和发现优秀内容,数量为 450 亿 KEY,占总量的 45%。激励池中的 KEY 初始由智能合约锁定,按时间逐步释放。每年释放激励池余额的10%,即:第一年释放 45 亿 KEY;第二年释放 40.5 亿 KEY,以此类推,永续进行。
推广运营池的代币数量为 250 亿 KEY,占代币总量的 25%,用于快速开拓新用户、吸引和激励意见领袖,以提高平台活跃度,帮助币乎尽早形成网络效应。当被推荐人完成币乎 ID的实名认证以及其他一些任务后,推荐人和被推荐人都获得一定数量的 KEY 作为奖励。早期的推荐奖励计划力度最大,后期视运营情况逐步减少。推广运营池的使用应 100%透明化,定期披露使用情况。
币乎基金会持有 250 亿 KEY,占总量的 25%。币乎基金会是一个非盈利性组织,其持有的 KEY 将保障币乎和币乎 ID 的技术开发工作得以完成,以及补贴运营和维护成本。币乎基金会可以亲自招募人员完成上述工作,或者委托第三方完成。
50 亿 KEY 将作为期权授予给币乎的开发和运营团队,占总量的 5%,期权分 5 年行权,每年行权 1%。
【产品设计初心分析】
各位看官注意到了没有,币乎没有ICO,也没有私募。项目启动的费用全部来之基金会投入,然后通过做大币乎平台,一起享受发展红利。
辉哥觉得这种方式是真正的看好区块链技术,对平台有足够信心的玩法。
4.4 点赞/踩机制
【产品设计初心分析】
这部分的设计,辉哥有点困惑。
1) 对踩这个动作的设计理解不透
目前踩这个动作后,用户没有任何收益,还会消耗有限的能量,同时也会造成该文章的收益权重降低。这个事情,只有敌人才会干。币乎需要培养阶级和敌人吗?还不如跟微信类似,只有赞,没有踩呢。
2) 举报没有收益
UGC类的知识IP输出平台,最大的问题可能是文章或者IP不满足各个主权国家的合规要求,被禁止。相对于中心化的过滤删帖,是不是采用朝阳大妈的方式更利于去恶存真,更利于平台发展呢? 那为什么不把举报这个动作设计为能量消耗的动作呢?而且在辉哥认为,如果这边被举报的文章最终被运营方删除,要给予举报人100倍以上的激励。
4.5 能量
【产品设计初心分析】
目前,所有人的能量是相同的,初始100点,按时间线性恢复。币乎用有限的点赞能量来提示用户珍视手中的投票权。
辉哥认为,能量设计的还不够巧妙。币乎倡导的不是好文有好报吗?所有的用户都是好的伯乐吗? 应该要有不同的权重,这个权重可能跟账户注册时间,累计点赞数量和有效性相关,让一些意见领袖能够浮上来,即使他是没有多少锁仓的穷人,只要其能对“好文有好报”这个初心有帮助,就应该给予合理的反馈。
4.6 文章/评论机制
【产品设计初心分析】
让知识创造者能享受50%的收益还是比较合理的。违规被删除,没有KEY的惩罚也是比较好的设计,只有对应账户禁言/封号的惩罚。因为在代币世界里,KEY就是金钱,因为文章违规就罚钱,币乎APP还不能担任法律的职责。
5. 运营分析
5.1 冷启动运营
【产品设计初心分析】
币乎采用邀请送币和实名领币的方式,迅速完成了初始用户的积累和激活。通过早期的邀请码才能注册,有效控制了运营跟产品成熟的匹配度。
5.2 运营生态
币乎社群通过运营方的知识宣讲和微信群维护,有效迅速扩大了知名度,积累了第一批用户。
然后通过平台生态的作者大V,中介组织者和板块管理人员的分工互助,完成了平台的自增长。
5.3 大V成长套路
辉哥参与了币乎社群的一个组织方的活动,梳理了中介组织机构的运营套路。通过这个互助可控的讨论,这个组织方发布的文字基本在11:40瞬间超过100个赞,完成了大V文章的冷启动。
这个套路,有没有让大家想起淘宝的刷单呢?
6. 智能合约分析
区块链公链技术的一个前提是公开透明去中心化,包括币乎的智能合约都是公开的,大家可以点击查看。
/*
* Copyright (C) 2017 DappHub, LLC
* @link https://github.com/dapphub/
*/
pragma solidity ^0.4.11;
/**
* @dev 调用合约方法,更好地处理异常
* 封装了.call、.exec、.tryExec
* @link https://github.com/dapphub/ds-exec/blob/c1e683ae3f1f1e8522b0cb80367b5ba444f3a252/src/exec.sol
*/
contract DSExec {
function tryExec(address target, bytes calldata, uint value) internal returns (bool call_ret)
{
return target.call.value(value)(calldata);
}
function exec(address target, bytes calldata, uint value) internal
{
if(!tryExec(target, calldata, value)) {
throw;
}
}
// Convenience aliases
function exec(address t, bytes c) internal
{
exec(t, c, 0);
}
function exec(address t, uint256 v) internal
{
bytes memory c;
exec(t, c, v);
}
function tryExec(address t, bytes c) internal returns (bool)
{
return tryExec(t, c, 0);
}
function tryExec( address t, uint256 v ) internal returns (bool)
{
bytes memory c;
return tryExec(t, c, v);
}
}
/**
* @dev 权限验证接口
* 验证用户钱包地址对合约方法的调用是否拥有权限
* @link https://github.com/dapphub/ds-auth/blob/b36fd917563483d10967b57af1c9c88d06204d67/src/auth.sol
*/
contract DSAuthority {
function canCall(address src, address dst, bytes4 sig) constant returns (bool);
}
/**
* @dev 变更权限日志
* 对账户进行合约操作授权或变更合约管理员时,记录日志
* @link https://github.com/dapphub/ds-auth/blob/b36fd917563483d10967b57af1c9c88d06204d67/src/auth.sol
*/
contract DSAuthEvents {
/* 合约操作授权时日志 */
event LogSetAuthority (address indexed authority);
/* 变更合约管理员日志 */
event LogSetOwner (address indexed owner);
}
/**
* @dev 权限验证合约
* 验证用户钱包地址对合约方法的调用是否拥有权限
* @link https://github.com/dapphub/ds-auth/blob/b36fd917563483d10967b57af1c9c88d06204d67/src/auth.sol
*/
contract DSAuth is DSAuthEvents {
/* 权限验证接口实例 */
DSAuthority public authority;
/* 定义合约管理员 */
address public owner;
/* 权限验证构造函数 */
function DSAuth() {
/* 指定合约管理员为合约创建者 */
owner = msg.sender;
/* 将管理员钱包地址写入日志 */
LogSetOwner(msg.sender);
}
/* 合约管理员身份转移 */
function setOwner(address owner_) auth
{
/* 经过授权后,设置新的合约管理员 */
owner = owner_;
/* 将新的管理员钱包地址写入日志 */
LogSetOwner(owner);
}
/* 合约操作授权 */
function setAuthority(DSAuthority authority_) auth
{
authority = authority_;
LogSetAuthority(authority);
}
/* 验证当前交易者是否拥有某个方法的操作权限 */
modifier auth {
assert(isAuthorized(msg.sender, msg.sig));
_;
}
/* 是否被授权 */
function isAuthorized(address src, bytes4 sig) internal returns (bool) {
if (src == address(this)) {
return true;
} else if (src == owner) {
return true;
} else if (authority == DSAuthority(0)) {
return false;
} else {
return authority.canCall(src, this, sig);
}
}
/* 异常处理 */
function assert(bool x) internal {
if (!x) throw;
}
}
/**
* @dev 记录函数调用日志
* 通过note函数修改器提供通用函数调用日志记录,该修改器触发将数据捕获为LogNote事件
* @link https://github.com/dapphub/ds-note/blob/dbc97b158c743d8a33634d26c543f59bc0be61c3/src/note.sol
*/
contract DSNote {
event LogNote(
bytes4 indexed sig,
address indexed guy,
bytes32 indexed foo,
bytes32 indexed bar,
uint wad,
bytes fax
) anonymous;
modifier note {
bytes32 foo;
bytes32 bar;
assembly {
foo := calldataload(4)
bar := calldataload(36)
}
LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);
_;
}
}
/**
* @dev 安全运算库
* @link https://github.com/dapphub/ds-math/blob/49b38937c0c0b8af73b05f767a0af9d5e85a1e6c/src/math.sol
*/
contract DSMath {
/* uint256加运算 */
function add(uint256 x, uint256 y) constant internal returns (uint256 z) {
assert((z = x + y) >= x);
}
/* uint256减运算 */
function sub(uint256 x, uint256 y) constant internal returns (uint256 z) {
assert((z = x - y) <= x);
}
/* uint256乘运算 */
function mul(uint256 x, uint256 y) constant internal returns (uint256 z) {
z = x * y;
assert(x == 0 || z / x == y);
}
/* uint256除运算 */
function div(uint256 x, uint256 y) constant internal returns (uint256 z) {
z = x / y;
}
/* uint256求最小数 */
function min(uint256 x, uint256 y) constant internal returns (uint256 z) {
return x <= y ? x : y;
}
/* uint256求最大数 */
function max(uint256 x, uint256 y) constant internal returns (uint256 z) {
return x >= y ? x : y;
}
/* uint128加运算,h即half缩写 */
function hadd(uint128 x, uint128 y) constant internal returns (uint128 z) {
assert((z = x + y) >= x);
}
/* uint128减运算 */
function hsub(uint128 x, uint128 y) constant internal returns (uint128 z) {
assert((z = x - y) <= x);
}
/* uint128乘运算 */
function hmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = x * y;
assert(x == 0 || z / x == y);
}
/* uint128除运算 */
function hdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = x / y;
}
/* uint128求最大数 */
function hmin(uint128 x, uint128 y) constant internal returns (uint128 z) {
return x <= y ? x : y;
}
/* uint128求最小数 */
function hmax(uint128 x, uint128 y) constant internal returns (uint128 z) {
return x >= y ? x : y;
}
/* int256求最小数 */
function imin(int256 x, int256 y) constant internal returns (int256 z) {
return x <= y ? x : y;
}
/* int256求最大数 */
function imax(int256 x, int256 y) constant internal returns (int256 z) {
return x >= y ? x : y;
}
/*
* WAD math
*/
uint128 constant WAD = 10 ** 18;
function wadd(uint128 x, uint128 y) constant internal returns (uint128) {
return hadd(x, y);
}
function wsub(uint128 x, uint128 y) constant internal returns (uint128) {
return hsub(x, y);
}
function wmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = cast((uint256(x) * y + WAD / 2) / WAD);
}
function wdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = cast((uint256(x) * WAD + y / 2) / y);
}
function wmin(uint128 x, uint128 y) constant internal returns (uint128) {
return hmin(x, y);
}
function wmax(uint128 x, uint128 y) constant internal returns (uint128) {
return hmax(x, y);
}
/*
RAY math
*/
uint128 constant RAY = 10 ** 27;
function radd(uint128 x, uint128 y) constant internal returns (uint128) {
return hadd(x, y);
}
function rsub(uint128 x, uint128 y) constant internal returns (uint128) {
return hsub(x, y);
}
function rmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = cast((uint256(x) * y + RAY / 2) / RAY);
}
function rdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
z = cast((uint256(x) * RAY + y / 2) / y);
}
function rpow(uint128 x, uint64 n) constant internal returns (uint128 z) {
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
function rmin(uint128 x, uint128 y) constant internal returns (uint128) {
return hmin(x, y);
}
function rmax(uint128 x, uint128 y) constant internal returns (uint128) {
return hmax(x, y);
}
function cast(uint256 x) constant internal returns (uint128 z) {
assert((z = uint128(x)) == x);
}
}
/*
* @dev ERC20标准接口
* @link https://github.com/dapphub/erc20/blob/768a3d8ca30590522c68951e989e5b69f5859151/src/erc20.sol
*/
contract ERC20 {
/* 查询token总发行量 */
function totalSupply() constant returns (uint supply);
/* 查询指定钱包地址的token余额 */
function balanceOf(address who) constant returns (uint value);
/* 查询owner授权spender还能提取的token余额 */
function allowance(address owner, address spender) constant returns (uint _allowance);
/* 转账value个token到指定钱包地址to */
function transfer(address to, uint value) returns (bool ok);
/* 批准spender账户从自己的账户转移value个token,可分多次转移 */
function approve(address spender, uint value) returns (bool ok);
/* 与approve搭配使用,approve批准之后,调用transferFrom来转移token */
function transferFrom(address from, address to, uint value) returns (bool ok);
/* 转账日志 */
event Transfer(address indexed from, address indexed to, uint value);
/* 授权日志,当调用approve成功时,一定要触发Approval事件 */
event Approval(address indexed owner, address indexed spender, uint value);
}
/**
* @dev ERC20标准合约
* @link https://github.com/dapphub/ds-token/blob/master/src/base.sol
*/
contract DSTokenBase is ERC20, DSMath {
/* 发行总量 */
uint256 _supply;
/* 账户余额 */
mapping (address => uint256) _balances;
/* 被授权token使用额度 */
mapping (address => mapping (address => uint256)) _approvals;
/* 合约初始化 */
function DSTokenBase(uint256 supply) {
/* 合约管理员拥有合约所有token */
_balances[msg.sender] = supply;
/* 合约的发行总量 */
_supply = supply;
}
/* 查询合约的发行总量 */
function totalSupply() constant returns (uint256) {
return _supply;
}
/* 查询账户的token余额 */
function balanceOf(address src) constant returns (uint256) {
return _balances[src];
}
/* 查询src授权guy还能提取的token个数 */
function allowance(address src, address guy) constant returns (uint256) {
return _approvals[src][guy];
}
/* 转账函数,从自己账户给dst转账wad个token */
function transfer(address dst, uint wad) returns (bool) {
assert(_balances[msg.sender] >= wad);
_balances[msg.sender] = sub(_balances[msg.sender], wad);
_balances[dst] = add(_balances[dst], wad);
Transfer(msg.sender, dst, wad);
return true;
}
/* 与approve搭配使用,approve批准之后,调用transferFrom函数来转移token */
function transferFrom(address src, address dst, uint wad) returns (bool) {
assert(_balances[src] >= wad);
assert(_approvals[src][msg.sender] >= wad);
_approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
_balances[src] = sub(_balances[src], wad);
_balances[dst] = add(_balances[dst], wad);
Transfer(src, dst, wad);
return true;
}
/* 批准guy账户从自己的账户转移wad个token,可以分多次转移。 */
function approve(address guy, uint256 wad) returns (bool) {
_approvals[msg.sender][guy] = wad;
Approval(msg.sender, guy, wad);
return true;
}
}
/**
* @dev 停止或开启合约
* 需要被授权才能操作,并记录函数参数日志
* @link https://github.com/dapphub/ds-stop/blob/master/src/stop.sol
*/
contract DSStop is DSAuth, DSNote {
/* 合约是否被停止 */
bool public stopped;
/* 合约非停止状态下才能操作 */
modifier stoppable {
assert (!stopped);
_;
}
/* 停止合约 */
function stop() auth note {
stopped = true;
}
/* 开启合约 */
function start() auth note {
stopped = false;
}
}
/**
* @dev ERC20标准合约
* @link https://github.com/dapphub/ds-token/blob/master/src/token.sol
*/
contract DSToken is DSTokenBase(0), DSStop {
/* token标志 */
bytes32 public symbol;
/* token精度 */
uint256 public decimals = 18; // standard token precision. override to customize
/* 合约管理员 */
address public generator;
/* 仅合约管理员才能操作 */
modifier onlyGenerator {
if(msg.sender != generator) throw;
_;
}
/* 初始化token标识、token创建者 */
function DSToken(bytes32 symbol_) {
symbol = symbol_;
generator = msg.sender;
}
/* 转账,方法重载,在没有停止合约的情况下,且记录操作日志 */
function transfer(address dst, uint wad) stoppable note returns (bool) {
return super.transfer(dst, wad);
}
/* 批准guy账户从自己的账户转移wad个token。可以分多次转移 */
function approve(address guy, uint wad) stoppable note returns (bool) {
return super.approve(guy, wad);
}
/* 与approve搭配使用,approve批准之后,调用transferFrom函数来转移token */
function transferFrom(address src, address dst, uint wad) stoppable note returns (bool) {
return super.transferFrom(src, dst, wad);
}
/* 将token从自己账户转账到另一个指定的地址(需要权限或批准,且未停止合约,记录函数参数日志) */
function push(address dst, uint128 wad) returns (bool) {
return transfer(dst, wad);
}
/* 从指定的账户转移token到自己账户(需要权限或批准,且未停止合约,记录函数参数日志) */
function pull(address src, uint128 wad) returns (bool) {
return transferFrom(src, msg.sender, wad);
}
/* 增发token(需要权限或批准,且未停止合约,记录函数参数日志) */
function mint(uint128 wad) auth stoppable note {
_balances[msg.sender] = add(_balances[msg.sender], wad);
_supply = add(_supply, wad);
}
/* 燃烧token(需要权限或批准,且未停止合约,记录函数参数日志) */
function burn(uint128 wad) auth stoppable note {
_balances[msg.sender] = sub(_balances[msg.sender], wad);
_supply = sub(_supply, wad);
}
/* 仅提供给合约管理员转账使用,记录函数参数日志 */
function generatorTransfer(address dst, uint wad) onlyGenerator note returns (bool) {
return super.transfer(dst, wad);
}
/* token名称 */
bytes32 public name = "";
/* 设置token名称(需要权限或批准) */
function setName(bytes32 name_) auth {
name = name_;
}
}
本文针对代码做极简分析,后面欧阳哥哥会输出精品分析文章。
【DSStop函数分析】
pragma solidity ^0.4.11;
import "./DSAuth.sol";
import "./DSNote.sol";
contract DSStop is DSAuth, DSNote {
bool public stopped;
modifier stoppable {
assert (!stopped);
_;
}
function stop() auth note {
stopped = true;
}
function start() auth note {
stopped = false;
}
}
要是提供了一个stoppable 的modfier, 这个的作用是判断合约有没有处于停止状态,如果合约状态处于停止状态,那么会禁止Token的转账。可以在DSToken的 transfer 和 transferFrom 方法上看到都有 stoppable 的修饰。这意味着币乎可以随时把KEY熔断,限制交易?!细思极恐...
其他函数不做分析,KEY符合ERC20规则,更多内容结合《第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易》文章完成学习。
欧阳哥哥针对币乎智能合约有一个更详细的分析,非常精彩,可点击查看《【以太坊开发】解读币乎KEY智能合约(BihuKeyToken)》
7. 运营风险
7.1 KEY被禁止交易风险
2017年9月4日,《中国人民银行 中央网信办 工业和信息化部 工商总局 银监会 证监会 保监会关于防范代币发行融资风险的公告》,明确说明:
本公告发布之日起,任何所谓的代币融资交易平台不得从事法定货币与代币、“虚拟货币”相互之间的兑换业务,不得买卖或作为中央对手方买卖代币或“虚拟货币”,不得为代币或“虚拟货币”提供定价、信息中介等服务。
对于存在违法违规问题的代币融资交易平台,金融管理部门将提请电信主管部门依法关闭其网站平台及移动APP,提请网信部门对移动APP在应用商店做下架处置,并提请工商管理部门依法吊销其营业执照。
虽然目前支持KEY交易的交易所都在海外,不存在被明确禁止的情况。但是其APP主要在中国各大应用平台上线是不争的事实。主管部门是什么态度呢?如果被禁止了,运营方可以执行DSStop合约完成停止动作。但对于哪些购买并大量持有KEY的用户来说,能承担这个风险吗?
【风险应对建议】
建议币乎平台要尽快发布国际版APP和支持区块链代币发行国家的社区APP,做好用户多样化,防止休克置零风险。
7.2 APP勒令下线风险
币乎平台是一个UGC的内容发布平台,那输出文章的合法合规如何得到保障呢?平台是否有能力,如百度,微博一样搭建足够强大的后台删帖团队和底层机制,完成合规性保障呢?会不会因为某些帖子也遭遇停业整顿,下线关闭呢?
【风险应对建议】
建议币乎运营团队跟主管部门尽快建立有效的沟通渠道,从技术上做好应对准备。
7,参考文档
《币乎白皮书 》
《币乎用户协议(草案)》
《币乎公开课 纷繁中寻找理性》
尊重知识输出,如需引用,敬请说明本文链接和作者-笔名辉哥。
币乎推荐内部邀请码:398012
注册并完成实名认证后才会有币空投,曾经70000个币,现在只有33000个币了,还可能下降,注册实名要早哦。
还有他们家的MYKEY钱包,目前转发都是免费的,可安装。