なぜPoliPoliはNEMを使うのか

ぼくが代表を務めるLCNEMは、PoliPoliにウォレット連携、NEM技術アドバイスという形で提携します。

プレスリリース

PoliPoliは、従来の手法では、社会的に必要であってもビジネス化が難しい「政治を身近なものに」ということを、トークンエコノミーを生み出すことによって実現するというスタートアップ企業です。

そのPoliPoliがなぜNEMを使うのか、株式会社PoliPoli代表取締役、伊藤君に直接聞きました。その真意を解説します。

 

代表取締役 伊藤和真氏

Q.どういう風にNEMを使うの?

 

 

 

 

PoliPoliでは政治家と市民のトークンエコノミーを作ります。

政治コミュニティは誹謗中傷などが集まりやすく、委縮にもつながっています。また、特に地方の政治家の多くは資金不足に悩んでおり、また支持者獲得の手法がアナログで非効率なものとなっています。

これらの問題を解決するビジネスモデルをつくることは従来の手法では難しいものでしたが、PoliPoliはトークンエコノミーを使った評価経済モデルによってそれを実現します。

 

この独自通貨の「Polin」をmosaicで発行します。

なるほど。評価経済モデルにより荒らさないインセンティブをつくり、また政治家へのインセンティブにもなるということですね。

僕が無価値トークンのトークンエコノミーはまずいと言ってきたこともあり、ちゃんとトークンが無価値にならないようにしているようです。

補足

信用スコアは、ユーザー数を\(n\)、もらったいいねの順位を\(X\)、政治家へのトークン量の順位を\(Y\)、保有トークン量の順位を\(Z\)とすると

$$ 信用スコア = 60\left(1-log_nX\right)+30\left(1-log_nY\right)+10\left(1-log_nZ\right) $$

という風に決めたりするようです。PoliPoliのサイトにある企画書とかみてみると面白いかもしれません。

 

Q.NEMを採用した決め手は?

 

 

 

 

実装のしやすさと、セキュリティを簡単に固められるということですね。マルチシグを使って、Polinトークン保管のセキュリティも固めます。

あと、NEMはまだ全然使われてないのでトランザクションの手数料が高騰してないってのもあります。

 

 

たしかにNEMはまだブロックがスカスカで、手数料が最低に張り付いてますね。

最低手数料は以下の方法で求まりますが

$$ max \left( 0.05, XemFee( \frac{8999999999}{s} \times x) – 0.05 floor \left( 0.8 \times log \frac{9000000000 \times {10}^6}{s \times {10}^d} \right) \right)$$

$$ where XemFee\left(x\right) = min \left( 0.05 ceiling \left( \frac{x}{10000} \right) , 1.25 \right) $$

高騰するまでまだかなりの余地がありそうですし、当分は0.05XEMに満たない安い状態が続くでしょうね。

詳しくはNEMモザイク送金手数料をOctaveで4次元グラフにしてみたを参照。

Q.Ethereumを採用することも視野に入れてたと思うけど

 

 

 

 

EthereumのERC20をつかうことも視野に入れましたが、NEMモザイクを使うことにしました。万が一コントラクトにバグがあっても簡単に修正が効くことと、実装が簡単なことが理由です。

Totellusという教育に関するトークンエコノミーのプロジェクトもNEMを採用するみたいです。

 

 

なるほど。

解説

Ethereumというブロックチェーンは、送金専用に作られたものではなく、スマートコントラクトを実行するプログラムをデプロイし、さらにその実行結果を保存するという目的のブロックチェーンです。Ethereum自体には独自トークンを発行する専用の機能はなく、ERC20というトークンのようにふるまうための規格にしたがって書かれたプログラムを展開することで独自トークンを発行できます。

以下、ERC20のインターフェイス


contract ERC20 {
  function totalSupply() constant returns (uint totalSupply);
  function balanceOf(address _owner) constant returns (uint balance);
  function transfer(address _to, uint _value) returns (bool success);
  function transferFrom(address _from, address _to, uint _value) returns (bool success);
  function approve(address _spender, uint _value) returns (bool success);
  function allowance(address _owner, address _spender) constant returns (uint remaining);
  event Transfer(address indexed _from, address indexed _to, uint _value);
  event Approval(address indexed _owner, address indexed _spender, uint _value);
}

このインターフェースを実装したコード(主にsolidityという専用の言語で書きます)をデプロイしてトークンを発行し、別途アプリ等でこのコントラクトを実行するトランザクションを発行するようにします。

一方、NEMブロックチェーンは、独自トークンの発行など必要な機能だけネイティブで提供し、コントラクトプログラムをブロックチェーンにデプロイさせる機能は提供せず、既存の手法(REST API)で実行させるというスタンスです。

トークンの発行は、NanoWalletからGUIで行います。

別途、アプリでトークンを送信するには、REST APIを使うことになっています。nem2-sdkというラッパーライブラリがあるので、これを使うことになると思います。

以下の手順で行います。

1.トランザクションのオブジェクトをつくる
(以下、nem2-sdk JavaScript/TypeScriptのソースコードの一部です。nem2-sdkはREST APIのラッパーなので、これらのメソッドを使えばNEMチェーンに書き込むことができます。)


export class TransferTransaction extends Transaction {
    /**
     * Create a transfer transaction object
     * @param deadline - The deadline to include the transaction.
     * @param recipient - The recipient of the transaction.
     * @param mosaics - The array of mosaics.
     * @param message - The transaction message.
     * @param networkType - The network type.
     * @returns {TransferTransaction}
     */
    public static create(deadline: Deadline,
                         recipient: Address,
                         mosaics: Mosaic[],
                         message: Message,
                         networkType: NetworkType): TransferTransaction {
        return new TransferTransaction(networkType,
            3,
            deadline,
            new UInt64([0, 0]),
            recipient,
            mosaics,
            message);
    }
}

 

2.トランザクションのデジタル署名をつくる


export class Account {
    /**
     * @internal
     * @param address
     * @param keyPair
     */
    private constructor(
                        /**
                         * The account address.
                         */
                        public readonly address: Address,
                        /**
                         * The account keyPair, public and private key.
                         */
                        private readonly keyPair: IKeyPair) {
    }

    /**
     * Sign a transaction
     * @param transaction - The transaction to be signed.
     * @return {SignedTransaction}
     */
    public sign(transaction: Transaction): SignedTransaction {
        return transaction.signWith(this);
    }
}

 

3.トランザクションとデジタル署名をアナウンスする


export class TransactionHttp extends Http implements TransactionRepository {
    /**
     * Constructor
     * @param url
     */
    constructor(private readonly url: string) {
        super(url);
        this.transactionRoutesApi = new TransactionRoutesApi(this.apiClient);
    }

    /**
     * Send a signed transaction
     * @param signedTransaction - Signed transaction
     * @returns Observable
     */
    public announce(signedTransaction: SignedTransaction): Observable {
        return Observable.fromPromise(this.transactionRoutesApi.announceTransaction(signedTransaction))
            .map((transactionAnnounceResponseDTO) => {
                return new TransactionAnnounceResponse(transactionAnnounceResponseDTO.message);
            });
    }
}

nem2-sdkはJS/TS以外にもJava/Kotlin、C#/.NET、PHP、Python、Go、Rubyをサポートするようです。

Ethereumは、改ざんされることのないスマートコントラクトコードを未来永劫にわたってデプロイするという特色によって、非中央集権的なスマートコントラクトを実行できるという強みを得ています。

ですがブロックチェーンにデプロイするということは裏返しとして変更ができないというわけでもあり、コントラクトプログラムにバグがあった場合に修正が難しい(工夫をすれば不可能ではないが)という問題も出てきます。

Ethereumを使いこなせれば非常に強力であることを判断材料にしつつ、このトレードオフも考慮に入れた結果、PoliPoliにはNEMのほうが適していると判断したというわけですね。

Q.最終目標は?

 

 

 

 

ゆくゆくは、サービスの中央集権性を薄めていき、段階的に自律させていきたいと思っています。

自律分散はEthereumが向いていますが、まだはっきりとは決まっていません。NEMでいく可能性もあります。

 

 

 

たしかに自律分散はEthereumが向いてるし今のNEMじゃ難しいけど、NEM2が出て、「プログラム修正可能性を残したままプログラムデプロイの非中央集権化をする」ためにIPFSを組み合わせれば可能性ありますね。できなかったらEthereum、みたいな感じでいいかもしれない。

 

 

 

PoliPoli代表取締役伊藤氏、ありがとうございました!

 

LCNEMとPoliPoliはどちらも若いです。若い力で新たなムーブメント起こしていきたいと思います。応援よろしくお願いいたします!

カテゴリーNEM