ニハオ!
はじめに
USEは降伏しないため、私は長い間何も書きませんでしたが、 バルト海大会のクラスを書くことは仕方がありませんでした。 私はどこからでも良いアイデアを絞り出すことができなかったので、その時(半月前)、ブロックチェーン、暗号通貨、スマートコントラクト、その他の巧妙な英単語の世界に、私にはまったく馴染みのないトピックに突入することにしました。 レッスンでは、携帯電話に出会い、ブロックチェーン、peer2peerネットワーク、その他すべてに関する多くのテキストを読み、徐々に整理しました。 Javascript'eで簡単なプロトタイプを書き始めたとき、すべてが簡単になりました。もう一度、すべてがテキストよりもコードの方が理解しやすいと確信しています。 その結果、ある種の問題を見つけたときに、記事のタイトルに表示される作品のトピックを決定しました。
それがすべてであり、なぜそれが必要なのか
Vibrantは、分散アプリケーションのラピッドプロトタイピング用にKotlinで書かれたライブラリです。 アイデアは、将来のシステムの特定の側面に集中し、未実現のコードを既製のソリューションに置き換えることです。 たとえば、分散チャットを書くことを計画しています。
すぐに実装が必要なポイントがいくつかあります:ピア間の接続を提供する方法、使用する通信プロトコル、チャットしようとする場合、LANでUDPを必要とするか、TCPまたはHTTPを介してそれを行うことができますか...主要なタスク。これなしでは何も機能しません。 また、分散プラットフォームで簡単なチャットを作成するには、一定量の機能を実装する必要があります。 2つのパッケージで構成されるVibrantは、この問題をorg.vibrant.core
ますorg.vibrant.core
アーキテクチャの抽象化、およびorg.vibrant.base
—コアパッケージからの抽象化のさまざまな実装(例: HTTPPeer
、 HTTPJsonRPCPeer
— httpを介して通信するHTTPJsonRPCPeer
、 1つ目はより抽象的で、2つ目はノード間の通信にJSON RPC 2.0プロトコルを使用します。
一般的に、最初からごちそうを書く代わりに、既製のJSON RPCごちそうを使用します。 プロトコルを変更する必要がある場合、または独自の何かを作成したいという強い要望がある場合は、抽象化によりフラグを手に入れることができます。
そして、それを使用する方法は?
class Peer(port: Int, rpc: BaseJSONRPCProtocol): HTTPJsonRPCPeer(port, rpc){ val miners = arrayListOf<RemoteNode>() fun broadcastMiners(jsonrpcRequest: JSONRPCRequest): List<JSONRPCResponse<*>> { return this.broadcast(jsonrpcRequest, this.miners) } fun addUniqueRemoteNode(remoteNode: RemoteNode, isMiner: Boolean = false) { super.addUniqueRemoteNode(remoteNode) if (isMiner && this.miners.find { it.address == remoteNode.address && it.port == remoteNode.port } == null) { this.miners.add(remoteNode) } } }
HTTPJsonPeer
簡単な実装をHTTPJsonPeer
ます。 rpc: BaseJSONRPCProtocol
引数に気付かない限り、 rpc: BaseJSONRPCProtocol
何ができるかを言うことは不可能です。 このクラスを初期化して実行すると、選択したポートでHTTPサーバーが起動され、 /rpc
エンドポイントへのPOST
JSON RPCリクエストを受信し、それらをKotlinオブジェクトに変換し、渡されたBaseJSONRPCProtocol
で適切なメソッドを呼び出します。 つまり、プラグアンドプレイです。
JSON RPCリクエストを介して実行できるメソッドの例を次に示します。
@JSONRPCMethod fun getLastBlock(request: JSONRPCRequest, remoteNode: RemoteNode): JSONRPCResponse<*>{ return JSONRPCResponse( result = node.chain.latestBlock().serialize(), error = null, id = request.id ) } @JSONRPCMethod fun newBlock(request: JSONRPCRequest, remoteNode: RemoteNode): JSONRPCResponse<*>{ val blockModel = BaseJSONSerializer.deserialize(request.params[0].toString().toByteArray()) as BaseBlockModel node.handleLastBlock(blockModel, remoteNode) return JSONRPCResponse( result = node.chain.latestBlock().serialize(), error = null, id = request.id ) }
だからここですぐにごちそうを作ることができます。
しかし、ブロックチェーンはどこにありますか?! 彼がいる。
abstract class InMemoryBlockChain<B: BlockModel, out T: BlockChainModel>: BlockChain<B, T>() { protected val blocks = arrayListOf(this.createGenesisBlock()) override fun latestBlock(): B = this.blocks.last() override fun addBlock(block: B): B { synchronized(this.blocks, { this.blocks.add(block) this.notifyNewBlock() return this.latestBlock() }) } }
これはorg.vibrant.base
パッケージのクラスであり、継承すると、メモリ内にのみ存在するブロックチェーンを安全に使用できます。 このようなブロックチェーンは、たとえば、アプリケーションのテストに適しています。
InMemoryBlockChain
の存在は開発者を制限しないことは注目に値します。独自のInMemoryBlockChain
作成できます。ここでは、arraylistの代わりにh2データベースが使用されますが、これはすでに「ボイラープレートをスチームしたくない、ボイラープレートとコードを書く能力を与えてください」という項目に適用されます
排除
私はこのプロジェクトに積極的に取り組んでいます。たとえば、 IotaのイメージにTangleを実装したり、Nettyチャネルなどを使用して高品質のUDPPeerを作成したりするなど、追加したいことがたくさんあります。 そうそう、今はスマートコントラクトに取り組んでいます。これはplug and play
もあります。 面白いと思う
おわりに
プルリクエストという形での読者の熱意を非常に嬉しく思います。
githubのリンク:
コア抽象化パッケージ
実装を含む基本パッケージ
作業中のチャットアプリケーション