2022.01.12
Klaytnブロックチェーンの紹介及び既存イーサリアムアプリをKlaytnへのマイグレーションについて
はじめに
こんにちは、次世代システム研究室のB.M.Kです。
近年、ビットコイン、イーサリアムなどの従来のブロックチェーンネットワークより速く、安価でエンタープライズグレード及びサービス中心に向けて生まれた多くの新しいブロックチェーンネットワークがあります。そのうちの1つがKlaytnブロックチェーンネットワークです。今回はKlaytnブロックチェーン及び既存イーサリアムアプリからKlaytnへのマイグレーションを紹介します。
Klaytnブロックチェーンの概要
Klaytnは韓国最大のモバイルプラットフォーム「Kakao」の子会社である「Ground X」が開発したブロックチェーンです。2019年6月にローンチされて「ハイブリッド」設計により、パブリックブロックチェーン(分散型データ及び分散型ガバナンス)そしてプライベートブロックチェーン(低レイテンシー、高スケーラビリティ)の両方の機能を備えています。ブロックチェーン技術を世間一般に広げることという大きな目的を持ち、誰もが簡単に分散型アプリ(Dapps)の作成、独自トークンの発行によって新しい経済圏を生めるプラットフォームを目指しています。
Klaytnブロックチェーンの特徴
- ハイパフォーマンス
- ロートランザクションフィー
- プライベートチェーンの提供
- 急速な開発可能
ハイパフォーマンス
2019年6月27日に立ち上げられたKlaytnのメインネットでは1秒のブロック生成時間で即時のトランザクションファイナリティを保証しています。メインネットでは、毎秒4000件を現在実現して、この性能は今後も向上すると予想されます。
ロートランザクションフィー
Klaytnネットワーク上、取引手数料は安定しており、周囲の要因ではなく、取引の複雑さ自体によって決定されます。イーサリアムネットワークと比較するとガスフィーはイーサリアムの約1/10の低ガス価格になります。
プライベートチェーンの提供
Klaytnは、サービスチェーンの設計でプライベートブロックチェーン専用のソリューションを提供しています。 サービスチェーンは独自のガバナンスを持ち、データアンカー(サービスチェーンのセキュリティの低下を補うためにサービスチェーンからメインチェーンへのブロックハッシュの定期的な保存)または資産の転送(KlaytnのネイティブトークンKLAY、およびBAppsによって発行されたトークン等の転送)のためにKlaytnメインチェーンに接続できます。
急速な開発可能
Klaytn仮想マシン(KLVM)はイーサリアム仮想マシン(EVM)から派生しているため、Klaytn仮想マシン(KLVM)はイーサリアムコントラクトをサポートし、イーサリアム上のアプリ(Dapps)をKlaytnに移行することが簡単になります。
Klaytnブロックチェーンネットの構成
Klaytnブロックチェーンネットワークは3つの論理サブネットワークに分割することができます。
コアセルネットワーク(CCN)
CCNは、エンドポイントノード(EN)を介して送信されたトランザクションを検証および実行するコアセル(CC)で構成されます。CCNは、ネットワーク全体にブロックを作成して伝播する役割があります。
エンドポイントノードネットワーク(ENN)
ENNはRPC API要求を処理したり、サービスチェーンからのデータ要求を処理したりするエンドポイントノード(EN)で構成されます。
サービスチェーンネットワーク(SCN)
SCNは、ブロックチェーンアプリケーション(BApp)によって独立して操作される補助ブロックチェーンです。サービスチェーンは、ENを介してメインチェーンに接続します。
コアセルネットワークとエンドポイントノードネットワークは、Klaytnメインチェーン(メインネット)を形成します。
図1: Klaytnの階層型アーキテクチャ(CCN、ENN、SCN)
Klaytnのブロック生成とコンセンサスプロセス
Klaytnでは、「ラウンド」がブロック作成サイクルです。各ラウンドは新しいブロックを生成し、その後に新しいラウンドが開始されます。 Klaytnは1秒のラウンドタイムを目指しています。ただし、ネットワークトラフィックとノードの動作条件により、ブロックの作成間隔が変わる場合があります。
Klaytnは、各ラウンドでランダムに生成されるブロックの提案者としてコンセンサスノード(CN)を選択し、次にそのラウンドの委員会としてCNのグループを選択します。選択された各CNは、最新のブロックヘッダーから取得した乱数を利用して、このラウンドでCNが選択されたことを証明する暗号化操作を実行します。委員会の規模はビザンチン耐性でなければなりません。 CNNが小さい場合は、提案者を除く、すべてのCNが委員会に参加できます。
提案者が選択されるとラウンドの証明(提案者の公開鍵によって検証された暗号証明)をすべてのCNにブロードキャストします。選ばれた特定のラウンドの委員会(CN)がこの証明を確認し、新しいブロックを誰にブロードキャストするかを提案者に伝えます。次に、提案者はトランザクションプールからトランザクションのグループを選択し、それらをブロックに配置します。最後に、提案者は委員会と協力して、新しく設立されたブロックについて合意し、最終決定します。
Klaytnのスマートコントラクト
Klaytnは、イスタンブールイーサリアム仮想マシン(EVM)バージョンの分枝でしたため、イーサリアムスマートコントラクトを作成する主要なプログラミング言語のSolidityをサポートしています。Solidityで書いたスマートコントラクトを修正する必要がほとんどなくKlaytnにそのまま展開できます。Klaytnのスマートコントラクトを開発するときにKlaytn IDE(ブラウザベースのIDE及びコンパイラ)またはトリュフ(イーサリアムスマートコントラクト開発フレームワーク)などの開発ツールを利用して開発できます。Klaytnは現在トリュフv5.0.26をサポートしています。
既存のイーサリアムアプリをKlaytnに移行
Klaytnは、イーサリアム仮想マシ(EVM)と互換性があるだけではなくKlaytnのRPC APIおよびその他のクライアントライブラリは常にイーサリアムとほぼ同じAPI仕様を維持しているため、既存のイーサリアムアプリををKlaytnに移行するのはかなり簡単になります。
イーサリアムアプリをKlaytnに移行する際に変更する必要な箇所
まず、ノードに接続するライブラリを変更する必要があります。
イーサリアムDAppの場合は、web3ライブラリの経由でEthereumノードに接続して通信します。そしてRopstenなどのテストネットURLは ‘rpcURL’に割り当てられます。KlaytnのBAppの場合は、web3ライブラリの代わりに、caver-jsライブラリを利用して、Klaytnエンドポイントノード(EN)に接続して通信します。そして、「rpcURL」はRopstenのかわりにKlaytnのBaobabテストネットURLを指定します。
// import Web3 from 'web3' import Caver from 'caver-js' // const ROPSTEN_TESTNET_RPC_URL = 'https://ropsten.infura.io/' const BAOBAB_TESTNET_RPC_URL = 'https://api.baobab.klaytn.net:8651/' // const rpcURL = ROPSTEN_TESTNET_RPC_URL const rpcURL = BAOBAB_TESTNET_RPC_URL // const web3 = new Web3(rpcURL) const caver = new Caver(rpcURL) // export default web3 export default caver
Klaytnブロック番号コンポーネントの利用
Klaytnブロック番号コンポーネントは1秒(1000ms)ごとに現在のブロック番号を取得します。イーサリアムのweb3ライブラリをcaver-jsに置き換えるだけでイーサリアムイーサリアムブロック番号の代わりにKlaytnブロック番号をリアルタイムで同期できます。
// import web3 from 'ethereum/web3' import caver from 'klaytn/caver' ... getBlockNumber = async () => { // const blockNumber = await web3.eth.getBlockNumber() const blockNumber = await caver.klay.getBlockNumber() ... } // ... } export default BlockNumber
イーサリアムスマートコントラクトをKlaytnにデプロイ
上記述べたように、ほとんどの場合、イーサリアムスマートコントラクトを変更なしでそのままKlaytnにデプロイして使用することができます。 ただし、次の2つの問題に注意するべきです。
KlaytnがサポートしているEVMバージョン
Klaytnテストネット(Baobab)は現在、ロンドンイーサリアム仮想マシン(EVM)と互換して、Klaytnメインネット(Cypress)は現在、コンスタンティノープルイーサリアム仮想マシン(EVM)と互換性がありますが他のEVMバージョンとの下位互換性は保証されていません。 したがって、正しいターゲットオプションを使用してSolidityコードをコンパイルすることを強くお勧めします。
--evm-version london // for testnet --evm-version constantinople // for mainnet $ solc --evm-version london contract.sol
スマートコントラクトをデプロイする方法
Klaytnにスマートコントラクトを展開するに当たってはさまざまな方法があります。 Klaytn IDE、トリュフを使用するか、Solidityコンパイラ(solc)を使用してコントラクトを手動でコンパイルし、caver-jsを使用してデプロイできます。 caver-jsは、開発者がHTTPまたはWebsocket接続を使用してKlaytnノードと対話できるようにするJavaScriptAPIライブラリです。
トリュフは、スマートコントラクトの展開と実行するための最も人気のあるフレームワークであるため、以下のような設定でトリュフを利用して、Klaytnテストネットにスマートコントラクトを展開することができます。
- truffle-config.jsのネットワークプロパティを変更する
// const HDWalletProvider = require("truffle-hdwallet-provider") const HDWalletProvider = require("truffle-hdwallet-provider-klaytn") // const NETWORK_ID = '3' // Ethereum, Ropsten testnet's network id const NETWORK_ID = '1001' // Klaytn, Baobab testnet's network id // const RPC_URL = 'https://ropsten.infura.io/' const RPC_URL = 'https://api.baobab.klaytn.net:8651/' // Change it to your own private key that has enough KLAY to deploy contract const PRIVATE_KEY = '0x...' module.exports = { networks: { /* ropsten: { provider: () => new HDWalletProvider(PRIVATE_KEY, RPC_URL), network_id: NETWORK_ID, gas: '8500000', gasPrice: null, }, */ baobab: { provider: () => new HDWalletProvider(PRIVATE_KEY, RPC_URL), network_id: NETWORK_ID, gas: '8500000', gasPrice: null, }, }, compilers: { solc: { version: '0.5.6', }, }, }
- Klaytn テストネットへのデプロイ
$ truffle deploy --network testnet
まとめ
今回の記事はKlaytnブロックチェーンの特徴、ネットワークの構成、既存イーサリアムアプリをKlaytnに移行する際変更する必要があるところを紹介しました。Klaytnでは、既存イーサリアムアプリをほとんどの場合そのままでKlaytnにデプロイと実行できるため、エコシステムの拡大及び開発がスピーディな展開で実施することができ、またサービスチェーンの設計で企業のビジネス及びニーズに合わせて柔軟に対応することが期待できます。処理能力が高く、汎用性もあり、多くの韓国国内大企業と提携していて、今後、世界の企業との提携が進むことが予想できるため、将来性が期待できるブロックチェーンネットワークだと言えるでしょう。
最後に
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。アプリケーション開発の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD