前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【产品分析】扒开币乎社群华丽燥热的外衣,你看到了什么?

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

作者头像
辉哥
发布2018-08-10 11:18:35
1.6K0
发布2018-08-10 11:18:35
举报
文章被收录于专栏:区块链入门
  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(http://yehe.isd.com/column/support-plan/article-edit/(https://etherscan.io/token/0x4cd988afbad37289baaf53c13e98e2bd46aaea8c?a=0x69726ae4d92f48b97405d4e2785e4006c208a28a%29)

0x69726ae4d92f48b97405d4e2785e4006c208a28a - 44.7303%

2(https://etherscan.io/token/0x4cd988afbad37289baaf53c13e98e2bd46aaea8c?a=0x05b472923a5cf155e2fae5e2d4468faf28e853f4)

0x05b472923a5cf155e2fae5e2d4468faf28e853f4 - 24.9621%

3(https://etherscan.io/token/0x4cd988afbad37289baaf53c13e98e2bd46aaea8c?a=0xbc1ab7f58a95cf307ba5ee18cf06b7ed0120da7a)

0xbc1ab7f58a95cf307ba5ee18cf06b7ed0120da7a - 24.2600%

4(https://etherscan.io/token/0x4cd988afbad37289baaf53c13e98e2bd46aaea8c?a=0xb5b92093c60839db57ef79f431a93ab738e4e827)

: 0xb5b92093c60839db57ef79f431a93ab738e4e827 5.0000%

5(https://etherscan.io/token/tokenholderchart/0x4cd988afbad37289baaf53c13e98e2bd46aaea8c)

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. 智能合约分析

区块链公链技术的一个前提是公开透明去中心化,包括币乎的智能合约都是公开的,大家可以点击查看

代码语言:javascript
复制
/*
 * 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函数分析】

代码语言:javascript
复制
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,参考文档

《币乎白皮书 》

《币乎用户协议(草案)》

《币乎公开课 纷繁中寻找理性》

尊重知识输出,如需引用,敬请说明本文链接和作者-笔名辉哥。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.持币分析
  • 3. 商业模式
    • 3.1 产品定位
      • 3.2 全体合伙人制度
      • 4. 产品分析
      • 4.1 币乎通证KEY的使用价值
        • 4.2 币乎通证KEY的状态切换
          • 4.3 代币分配
            • 4.4 点赞/踩机制
              • 4.5 能量
                • 4.6 文章/评论机制
                • 5. 运营分析
                  • 5.1 冷启动运营
                    • 5.2 运营生态
                      • 5.3 大V成长套路
                      • 6. 智能合约分析
                      • 7. 运营风险
                        • 7.1 KEY被禁止交易风险
                          • 7.2 APP勒令下线风险
                          • 7,参考文档
                          相关产品与服务
                          区块链
                          云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档