美文网首页区块链入门区块链大学
【产品分析】扒开币乎社群华丽燥热的外衣,你看到了什么?

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

作者: 笔名辉哥 | 来源:发表于2018-05-16 20:06 被阅读70次

    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,参考文档

    《币乎白皮书 》
    《币乎用户协议(草案)》
    《币乎公开课 纷繁中寻找理性》

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/xzcmdftx.html