币乎KEY合约源码分析

币乎已经上线20多天了,从这20多天看,Token的激励真是很大啊。还没见过一个刚上线的产品就有用户自动组织打假、抨击发水文的、心甘情愿为币乎筹谋划策。而且币乎的体验目前还说还真是有很大的提升空间,但是活跃用户还是挺多,里面的大V都保持一天发一篇文章的频繁,当然发的大部分都是毫无营养的水文!不过相信币乎的发展,文章的水准会越来越高的。

币乎使用的KEY是ERC20 Token,我们可以直接在etherscan 上查看币乎KEY合约的代码。

直接看KEY合约的主要代码:

pragma solidity ^0.4.11;
import "./DSTokenBase.sol";
import "./DSStop.sol";
contract DSToken is DSTokenBase(0), DSStop {
    bytes32  public  symbol;
    uint256  public  decimals = 18; // standard token precision. override to customize
    address  public  generator;
    modifier onlyGenerator {
        if(msg.sender!=generator) throw;
        _;
    }

    function DSToken(bytes32 symbol_) {
        symbol = symbol_;
        generator=msg.sender;
    }

    function transfer(address dst, uint wad) stoppable note returns (bool) {
        return super.transfer(dst, wad);
    }
    function transferFrom(address src, address dst, uint wad) stoppable note returns (bool) {
        return super.transferFrom(src, dst, wad);
    }
    function approve(address guy, uint wad) stoppable note returns (bool) {
        return super.approve(guy, wad);
    }
    function push(address dst, uint128 wad) returns (bool) {
        return transfer(dst, wad);
    }
    function pull(address src, uint128 wad) returns (bool) {
        return transferFrom(src, msg.sender, wad);
    }
    function mint(uint128 wad) auth stoppable note {
        _balances[msg.sender] = add(_balances[msg.sender], wad);
        _supply = add(_supply, wad);
    }
    function burn(uint128 wad) auth stoppable note {
        _balances[msg.sender] = sub(_balances[msg.sender], wad);
        _supply = sub(_supply, wad);
    }
    // owner can transfer token even stop,
    function generatorTransfer(address dst, uint wad) onlyGenerator note returns (bool) {
        return super.transfer(dst, wad);
    }
    // Optional token name
    bytes32   public  name = "";
    function setName(bytes32 name_) auth {
        name = name_;
    }
}

为什么叫DSToken, 不是应该叫BiHuToken或者BHToken吗?

DSToken 继承了 DSTokenBase 和 DSStop 。DSTokenBase 主要是实现了ERC20 的接口,这在之前的几篇文章中都有提到过,这里就不在介绍了。主要是看下DSStop。

在DSToken中我们可以看到有一个generator属性,这个generator的值在构造函数中设置成了合约发布者的地址。而且还有一个onlyeGenerator的 modifier,用来判断当前操作人是不是合约发布者,这个合约发布者权利还是很大的,后面会再讲。

我们在看下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 的修饰。

function transfer(address dst, uint wad) stoppable note returns (bool) {
    return super.transfer(dst, wad);
}
function transferFrom(address src, address dst, uint wad) stoppable note returns (bool) {
     return super.transferFrom(src, dst, wad);
}

这意味着什么? 意味着 币乎可以随时把KEY归零啊有木有?只要禁止了KEY的流通那不就变成积分了吗?如果变成积分,大家还会有这么大的热情么?当然我们也可以理解这是币乎给自己留的后手,如果政策不允许币乎这么搞,币乎通过禁止KEY的流通来满足监管要求,就像迅雷的链克一样,国内是不允许交易了。币乎要禁止了,国外也是照样不能交易的。

DSStop中的 stop和start 就是关闭和打开KEY流通的方法。在这两个方法上我们又看到 auth 和 note 两个 modifier。先看下auth的实现:

pragma solidity ^0.4.11;
import "./DSAuthEvents.sol";
import "./DSAuthority.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;
    }
}

DSAuth 中有一个owner的属性,从字面意思可以猜到,owner应该会是管理合约的人,初始化的时候会设为合约发布者,但是后面是可以通过setOwner 来设置为其他账号,一般这个owner会设置为老板吧?。auth 的作用主要是认证当前操作人有没有权限。比如说 mint 跟 burn 这个方法
就需要auth来认证有没有权限了。mint 这个方法有点意思,mint可以给有权限的地址发放KEY,但是mint 是可以增加发行量的,币乎KEY虽然号称发行100亿,但是从这个方法来看,并没有限制KEY的发行量。也就是说币乎后面如果觉得KEY不够用了,还可以继续增发啊!增发啊! burn很好理解,币乎每隔一段时间会回购一定的KEY销毁。 从这个方法也可以看到这个销毁是真的把KEY销毁了,发行总量也减少了。

在来看下note的实现:

pragma solidity ^0.4.11;
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);

        _;
    }
}

这个就很好理解,对于一些重要的操作,币乎都需要记录下来,后面出了问题也可以有记录可查。

最后让我们来看下DSToken 中的generatorTransfer 这个方法,从这个方法可以看到是没有 stopable修饰的,注释上也写明了 即使禁止了转让但是owner还是可以转让Token的。这个方法的作用目前我还没想到有啥作用,既然禁止了token的转让只允许owner一个人可以转让那没什么大意义吧。

币乎目前是我看来非常有活力的社区,虽然才刚起步,但是我相信后面会越来越好。KEY目前在交易所目前价格也要3分一个,随着币乎的发展KEY的价格也会水涨船高的。现在币乎注册还有送7万的KEY,大家如果想要体验下币乎可以使用我的推荐链接,有兴趣的可以来体验下,也算是区块链落地的一个应用吧!

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

推荐阅读更多精彩内容

  • 【中文版】以太坊白皮书 翻译:少平、 Seven当中本聪在 2009 年 1 月启动比特币区块链时,他同时向世界引...
    __Seven__阅读 4,128评论 0 10
  • 以太坊白皮书地址:https://github.com/ethereum/wiki/wiki/White-Pape...
    rectinajh阅读 17,785评论 0 46
  • 了解自己的产品成为专家 在我们的现实的微商世界里,很多经销商遇到一点点难处就Hold不住了,遇到有一个人说我们的产...
    天空的黑夜阅读 183评论 0 0
  • 曾经很快乐 每天梦的真实 写满忧愁的脸上 藏不住内心的喜悦 如今百般入镜 一切由不得我 故作欢笑 胜过心中所有 生...
    青名阅读 265评论 0 1