美文网首页程序员
币乎KEY合约源码分析

币乎KEY合约源码分析

作者: RhainL | 来源:发表于2018-03-25 23:35 被阅读0次

币乎已经上线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,大家如果想要体验下币乎可以使用我的推荐链接,有兴趣的可以来体验下,也算是区块链落地的一个应用吧!

相关文章

  • 币乎KEY合约源码分析

    币乎已经上线20多天了,从这20多天看,Token的激励真是很大啊。还没见过一个刚上线的产品就有用户自动组织打假、...

  • 币乎 KEY 在 EOS 链上数据分析 | 映射数量、官方地址、

    7个月前,写过一篇《分析下币乎 KEY 的分布情况 | 币乎外的 KEY 少的可怜》。当时我说”币乎外的 KEY ...

  • 币乎一周年

    各位币乎用户,大家好! 依据币乎通证分配规则: “激励池中的KEY由智能合约锁定,按时间逐步释放。每年释放激励池余...

  • 币乎KEY收益分析

    大家到币乎上玩耍,最关键的是如何获得收益,根据我个人浅陋的理解,认为有以下来源: 代币也就是KEY的收益,KEY的...

  • 分析下币乎 KEY 的分布情况 | 币乎外的 KEY 少的可怜

    之前看到有伙伴分析了币乎 KEY 的情况,之后得出了结论,币乎外有大量的 KEY 在用户的地址中,说明有大量的用户...

  • 币乎合约solidity源码解读

    币乎是什么 币乎(bihu.com)是代币驱动的代币投资者垂直社区。在币乎,用户的付出和贡献将获得相应的回报。币乎...

  • 币乎的游戏规则,你真的懂吗?

    本文为币乎白皮书的概要解读,及币乎平台代币KEY激励机制的详细分析。币乎老司机可忽略本文。 近期在币乎平台发布了几...

  • Fountain 合约解析

    大体来说, 合约分为如下几个模块: 1: 合约逻辑控制分析、2: FTN源码部分分析、3: 合约安全性分析、4: ...

  • 币乎key的应用场景猜想

    币乎的 KEY是币乎的区块链代币,代表币乎及其周边生态的使用权。KEY是通过以太坊区块链以ERC20代币标...

  • 币乎狂撒金币、红包,注册就有钱

    币乎社区注册领KEY啦, 最高14万KEY,赶紧看看。 点击加入,注册链接 快点一起赚KEY吧 币乎(bihu.c...

网友评论

    本文标题:币乎KEY合约源码分析

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