【产品分析】扒开币乎社群华丽燥热的外衣,你看到了什么?

1. 社区分析

最近出来一个社群APP,其狂热繁忙让人瞠目结舌。辉哥基于社区体验,加入了几个微信群,结果发现根本看不过来,半天就有一堆消息,而且一个月来每天保持这样的热度。他们在讨论什么呢?他们要么就在区块链社群APP上输出文章的讨论/推广,要么就是为文章点赞赚钱。

币乎微信社群热度

打开币乎APP,结果发现热门板块随便一个文章都是上千的收入。显示的是人民币的价值,太有视觉冲击力了。看看这篇“数资本”讲区块链投资入门的文章,收入是4437元!好吧,原来作家是这么好当的,诺贝尔奖得主莫言知道这事会不会哭晕在厕所呢?
2.热门文章收入.jpg

这些都是别人家的故事。辉哥参加了天平组织的“BH好文好报”社群,每天11:40时刻抽3分钟点赞一些热推文章,结果每日收益都在几十元以上。
点赞收入

2.持币分析

目前币乎通证KEY已经在几个交易所上市,主要在biboxOTCBTC-可支付宝交易两个交易所。
2018年5月16日的价格为0.06元/KEY,按照1000亿的盘子总量,一个上线半年不到的APP,其市值已达60亿元!

KEY的价格

币乎KEY在初始创设的时候,分配如下图组成:
初始持仓

经过几个月的运行,其持仓账户有所变化,点击查看最新变化
2018.05.16持仓分析

具体分析:
[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的功能

具体文字描述参考币乎白皮书[白皮书好像被官网删除了,原因未明,需要者私信索要]
总结而言,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 文章/评论机制

10.文章发布和评价

【产品设计初心分析】
让知识创造者能享受50%的收益还是比较合理的。违规被删除,没有KEY的惩罚也是比较好的设计,只有对应账户禁言/封号的惩罚。因为在代币世界里,KEY就是金钱,因为文章违规就罚钱,币乎APP还不能担任法律的职责。

5. 运营分析

5.1 冷启动运营

冷启动

【产品设计初心分析】
币乎采用邀请送币和实名领币的方式,迅速完成了初始用户的积累和激活。通过早期的邀请码才能注册,有效控制了运营跟产品成熟的匹配度。

5.2 运营生态

12.运营生态

币乎社群通过运营方的知识宣讲和微信群维护,有效迅速扩大了知名度,积累了第一批用户。
然后通过平台生态的作者大V,中介组织者和板块管理人员的分工互助,完成了平台的自增长。

5.3 大V成长套路

13.大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钱包,目前转发都是免费的,可安装。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容