2020.04.08

Binance Chainでのトークンの発行

はじめに

こんにちは。次世代システム研究室のL.W.です。

 

世界最大級の仮想通貨取引所「Binance」は2019年4月にBinance ChainとBiance DEX(分散型取引所)をローンチしてから、約一年間稼働しており、180種類以上のトークン、7,000万件以上のトランザクションにより急速な成長が見られます。

Binance ChainはBinanceとそのコミュニティによって開発されたパブリックブロックチェーンシステムです。 Binance DEXは、Binance Chainの上に開発された分散型交換所を指します。

Binance Chainで何ができるかと思っている方が結構いらっしゃいますが、BinanceブロックチェーンとDEXは、分散型の方法でデジタル資産を発行および交換するための代替市場を作ることです。120種類以上のトークンは既にBinance DEXに上場されました。

ご存知のように、中央型取引所(CEX)と比べて、DEXのメリットは、なによりセキュリティですね、DEXでユーザのウォレットのプライベートキーを管理していないので、DEXがハッキングされても、資産は盗まれないです。

もう一つのメリットはやはり高額の上場手数料が掛からないことですね。今のCEX、例えば、Bianance.com、Huobiなどには上場手数料は不透明で、とてつもない手数料が掛かることがありそうです。

Binance Chain/DEXでトークンのSend, receive, burn,mint,freeze/unfreeze機能は備えていて、2つの異なるトークン間で取引ペアを作成して、上場手数料なしでDEXに上場することはより容易となります。

トークン発行基盤というと、Ethereumのことを思い出せます。発行済みトークンの時価総額についても、やはりEthereumが最も大きいです。

まずは、Ethereumでのトークンの発行のことをおさらいしましょう。

Ethereumでのトークンの発行について

Ethereum上でのトークンコントラクトに対して、共通のインターフェースと振る舞いを提供する試みとしてERC20が標準として定義されています。ERC-20 Token Standardとも呼ばれます。

contract ERC20Interface {
    function name() public view returns (string)
    function symbol() public view returns (string)
    function decimals() public view returns (uint8)
    function totalSupply() public constant returns (uint);
    function balanceOf(address tokenOwner) public constant returns (uint balance);
    function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);
  
    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

Ethereum上でのトークン発行の流れとして以下の通りです。

① ERC20に準拠したスマートコントラクトソースを作ります。スマートコントラクトの記述にSolidityというプログラミング言語が使われるのは一般的です。

② Truffleフレームワークなどを利用して、スマートコントラクトをコンパイルし、ABIファイルとバイトコードを生成します。

③ バイトコードでトークン発行のトランザクションを作って、イーサリアムネットにブロードキャストをします。(Truffleフレームワークでイーサリアムネットワークにマイグレーションするのはより簡単です。)

④ トークン発行済。ABIファイル、スマートコントラクトアドレスはweb3などのライブラリと連携して、トークンのスマートコントラクトとインターアクションができます。

勿論、すでに出回っているツール、例えばtokenmint、を利用すれば、Solidity、Truffle、ABIなどに詳しくない方に対しても、トークン発行もより手軽となります。

一方、Binance Chainでのトークン発行はイーサリアムと比べると、どうだろうか。Binance Chainのエコシステムは大丈夫か、Binance Chainのトークンはどのように発行できるかなどの疑問を持ち始めましょうか。

では、一緒にBinance Chainの世界に覗きにいきましょう。

 

Binance ChainとBinance DEXについて

Binance Chain

Binance ChainはTendermint BFTコンセンサスを使用しており、それに実行する専用のアプリケーションレイヤーがあります。 アプリケーションのアーキテクチャの簡単な概要は、次のようになります。

+------------+-----------+
| RPC API    | Web API   |
+------------------------+---------+
| Asset Management | Match Engine  |
+----------------------------------+
| Account Management | Governance  |---------> crypto and blockchain governance
+----------------------------------+
| State Caching and Persisence     +-+
+----------------------------------+ |
| Consensus Protocol               | |
+----------------------------------+ |-----> revised Tendermint
| P2P Protocol                     | |
+----------------------------------+ |
| Networking    |  Database        +-+
+----------------------------------+

Binance ChainのスペックはEthereumのとの比較は以下のようです。

※時価総額は、2020/4/1時点となります。

BEP-2

Ethereumでのトークン発行のスタンダードはERC20ですが、Binance Chainでのトークン発行のスタンダードはBEP-2(Binance Chain Evolution Proposal 2)となります。

BEPは、Binanceチェーンでのトークン管理の提案のことを指します。

 

トークンのプロパティ

・ Source Address:  トークンの発行するアドレス(発行者)です。

・ Token Name:  トークン名

・ Symbol: 新しく発行されたトークンの識別子です。

・ Total Supply:  発行されたトークンの総数になります。

・ Mintable: 将来ミントできるかどうかを意味します。これにより、トークンの総供給量が増加します。

※トークンの小数部分(Decimal Precision)ですが、8桁しかサポートしないです。Total Supplyの上限は90 billion(900億)と定められます。90 billionとなると、Mintしても増えません。

 

トークンのトランザクションのタイプ

・ Issue token
Binance Chainで新しいトークンを作成することです。 新しいトークンは何か新しいものの所有権を表し、他のブロックチェーンからの既存のトークンにペグすることもできます。

・ Transfer Tokens
ソースアドレスから目的アドレスにトークンを送金することです。

・ Freeze Tokens
Binance Chainのユーザーは、自分のアドレスにあるトークンを凍結することができます。
フリーズトランザクションでのトークンがロックされるため、注文の作成、別のアカウントへの転送、料金の支払いなどのトランザクションには使用できませんでした。

・ Unfreeze Tokens
ユーザーのアカウントで凍結されたトークンの一部をロック解除し、それらを再び流動させることです。

・ Mint Tokens
Mintableトークンの総供給を増やすことです。 Mintトランザクションのスタートはトークンの発行者(Source Address)でなければなりません。

・ Burn Tokens
トークンの総供給を減らすことです。 Burnトランザクションのスタートはトークンの発行者(Source Address)でなければなりません。

 

Binance Chainでの手数料

Binanche Chainでの手数料(fee)はBNBで支払うこととなります。トランザクションのタイプにより、手数料は異なります。

Binanche Chainはオンチェーンガバナンスを採用したので、手数料の提案が提案され、投票されるにつれて、時間とともに変化する可能性があります。

Mainnetの現在の料金表は次のとおりです。

このAPIで最新の料金を取得できます。

 

Binance DEX

これはBinance DEXのオフィシャルサイトです。ここでウォレットの作成、トレーニングができます。

トークンの上場提案の提出(Submit Proposal)

Binance DEXに新しい取引ペアを上場するon-chain提案の手順は以下のようです。

① Proposal
Binance Chain Community Forumで提案を提出します。トークンと絡む要件を詰める必要があります。

② 最初の取引ペアのベース資産(quote asset)としてBNBを要求されます。タイプのProposal requestのトランザクションを出します。手数料は5BNBです。

③ Depositを提出する
トークン発行者は、2日以内に少なくとも1,000 BNBを入金する必要があります。

④ Vote
トークン発行者としてBinance Chain Validatorsの投票結果を待ちます。
悪質のプロジェクトと判定される場合デポジットを没収されるが(極めて珍しい)、これ以外は払い戻されます。

Binanceチェーンでのトークンの発行

Binance Chainのテストネットを利用して、トークンの発行、送金、上場を試してみることができます。

Binance DEXのオフィシャルでトークンの発行

① ウォレットを作成して、DEXにログインします。

② 一番右上には「issue Token」メニューがあります。クリックすると、トークン発行の画面に入ります。

③ トークンのプロパティを入力して、「issue Token」ボタンクリックすると、登録しているウォレットでトークンの発行できます。

④ トークンが発行できてから、Binance Chain エクスプローラーで確認できます。

⑤ トークンのProposal(上場申請提案)、List(上場)、Freese、UnFreese、Burn、Mint、Sendができます。

Binance APIでトークンの発行

Binanche Chainはjavascript-sdkを提供しました。これでトークンの発行も簡単できます。

ある例をここで張ります。

const BnbApiClient = require('@binance-chain/javascript-sdk');
const crypto = BnbApiClient.crypto;
const utils = BnbApiClient.utils;

// Token params
const tokenName = "Your Token Name";
const tokenSymb = "SYMBOL";
const tokenSupp = 1000000; // one million tokens
const tokenMint = false; // mintable token?

// Account params
const tokenAddr = "** PUT THE ISSUER ADDRESS HERE **";
const mnemonic = "** PUT THE ISSUER MNEMONIC HERE **";
const privKey = crypto.getPrivateKeyFromMnemonic(mnemonic);

const api = "https://testnet-dex.binance.org/"; // api string; remove "testnet-" for mainnet
const net = "testnet"; // or this can be "mainnet"

const bnbClient = new BnbApiClient(api);
bnbClient.chooseNetwork(net);

async function main() {
  await bnbClient.setPrivateKey(privKey);
  await bnbClient.initChain();
  await bnbClient.tokens.issue(tokenAddr, tokenName, tokenSymb, tokenSupp, tokenMint);
}
main();

 

このAPIドキュメントを読めば、トークンのProposal、List、Freese、UnFreese、Burn、Mint、Sendも簡単に試すことができます。

Binanceのバイナリツールでトークンの発行

Binance Chainはバイナリツールのbnbcli/tbnbcliを提供しましたが、これでトークンの発行も簡単にできます。

####### Example on mainnet #######
# To issue a NNB mintable token with total-supply 1 billion on mainnet
> ./bnbcli token issue --token-name "new token" --total-supply 100000000000000000 --symbol NNB --mintable --from alice  --chain-id Binance-Chain-Tigris   --node  https://dataseed5.defibit.io:443 --trust-node

# To Mint
> ./bnbcli token mint --amount 100000000000000000 --symbol NNB-B90 --from alice --chain-id Binance-Chain-Tigris   --node  https://dataseed5.defibit.io:443  --trust-node

# To burn
> ./bnbcli token burn --amount 100000000000000000 --symbol NNB-B90 --from alice --chain-id Binance-Chain-Tigris   --node  https://dataseed5.defibit.io:443  --trust-node

# To freeze
> ./bnbcli token freeze --amount 20000000000000000 --symbol NNB-B90 --from alice --chain-id Binance-Chain-Tigris   --node  https://dataseed5.defibit.io:443 --trust-node

# To unfreeze
> ./bnbcli token unfreeze --amount 20000000000000000 --symbol NNB-B90 --from alice --chain-id Binance-Chain-Tigris   --node  https://dataseed5.defibit.io:443  --trust-node

####### Example on testnet #######

# To issue a NNB mintable token with total-supply 1 billion on testnet
> ./tbnbcli token issue --token-name "new bnb" --total-supply 100000000000000000 --symbol NNB --mintable --from alice --chain-id=Binance-Chain-Nile --node=data-seed-pre-2-s1.binance.org:80 --trust-node

# To Mint
> ./tbnbcli token mint --amount 100000000000000000 --symbol NNB-B90 --from alice --chain-id=Binance-Chain-Nile --node=data-seed-pre-2-s1.binance.org:80 --trust-node

# To burn
> ./tbnbcli token burn --amount 100000000000000000 --symbol NNB-B90 --from alice --chain-id=Binance-Chain-Nile --node=data-seed-pre-2-s1.binance.org:80 --trust-node

# To freeze
> ./tbnbcli token freeze --amount 20000000000000000 --symbol NNB-B90 --from alice --chain-id=Binance-Chain-Nile --node=data-seed-pre-2-s1.binance.org:80 --trust-node

# To unfreeze
> ./tbnbcli token unfreeze --amount 20000000000000000 --symbol NNB-B90 --from alice --chain-id=Binance-Chain-Nile --node=data-seed-pre-2-s1.binance.org:80 --trust-node

 

まとめ

Binance Chainでのトークンの発行は簡単ですね。皆さんも発行してみてください。

モバイルウォレット、webウォレット、ハードウェアウォレットなど、20種類以上のウォレットはBinance chainをサポートしています。送金着金機能のウォレットもあれば、Binance DEXと連携するのもあります。

Binance Chainはあくまでコミュニティによりガバナンスされますので、コミュニティでの記事からすると、やり取りも活発に見えます。

Binance Chainはまだ若いなので、これからもどんどん成長していくかと思います。代表的なDEXとして、これから上手くいけば、Binance CEXが消える日が来るかと思っています。

 

さいごに

次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。

皆さんのご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事