RChainは、分散コンピューティングのブロックチェーンプラットフォームです。 イーサリアムのように、桁違いに高速です。 理論的には、無限にスケーリングできます。実際の最初の実装では、1秒あたり最大4万件のトランザクションを処理できます。 技術的な詳細はアーキテクチャ文書にあります。
RChainプラットフォームの契約はrholang言語で書かれており、 Habrの聴衆に紹介したいと思います。 dockerを介してRchainノードをダウンロードして実行するか、サイトのインタープリターを使用することにより、この言語でプログラムを作成して実行することができます 。
完全なチュートリアル
Rolang(または単にro )はプロセス指向の言語です。 それに関するすべての計算は、「 チャネル 」間でメッセージを送信することによって実行されます。 チャネルには複数のメッセージが保存されます。 Poは完全に非同期の言語であるため、 チャネルでメッセージを受信する順序は何の役割も果たしません。 たとえば、 チャネルからメッセージを読み取り、そのメッセージに対して何らかの操作を実行できます。 ただし、メッセージを送信して、メッセージの受信後に何かを行うことはできません。 少なくとも、配信確認メッセージの期待を個別に指定しない。 このチュートリアルでは、 名前とチャンネルという用語を同義語として使用することに注意してください。 で rholangの基になっている代数では、 名前nameが使用されますが、彼らの助けを借りてデータを送受信できるので、それらは意味的にchannelと似ています 。
契約とデータ提出
1 contract @"HelloWorld"(return) = { 2 return!("Hello, World!") 3 } | 4 new myChannel in { 5 @"HelloWorld"!(*myChannel) 6 }
- roプログラムは、同期して実行される複数の部分で構成される単一のプロセスです。 このプロセスは、@ "HelloWorld"という名前のコントラクトを作成することにより開始されます。 コントラクトを作成すると、メッセージを受信するたびに「ボディ」のコピーを呼び出すプロセスが開始されます。 ロールでは、@演算子を使用してすべてのプロセスを「引用」し、 チャネルにできることに注意してください。 行は特別なプロセスであり、任意のプロセスを引用してチャネルを作成できます 。 Scalaで書かれたrspaceライブラリは、RChainプラットフォームにデータを保存する役割を果たします。
-
return
チャネルでは、文字列「Hello、World!」を送信します -
new ... in
コンストラクトを使用すると、新しいプライベートチャネルを作成できます。 他のプロセスは、このチャネルからメッセージを送受信できません。 channel_nameを別のプロセスに送信して、各例外を個別に指定する必要があります。 - @「HelloWorld」の契約にmyChannelを送信します。
*
演算子は、 チャネルを「引用解除」することを意味し、元のプロセスを返します。 roでは、チャネルでのみプロセスを送信できます 。 チャネルをチャネルに直接送信することはできません。 このようにして、プライベートチャネルを送信する前にプロセスに変換します。
データ検索
1 contract @"HelloAgain"(_) = { 2 new chan in { 3 chan!("Hello again, world!") | 4 for (@text <- chan) { Nil } 5 } 6 } | @"HelloAgain"!(Nil)
- コントラクトには少なくとも1つのパラメーターがありますが、ワイルドカード文字
_
指定することでこれを回避できます。 - 新しい
chan
チャンネルを作成しています。 - ラインプロセス「こんにちは、また世界!」を送信しています。 新しいチャンネルで 。
- 新しいチャンネルを聞いており、唯一のメッセージを待っています。
for
操作は、chan
チャネルにメッセージがあるまでブロックされたままです。 roでは、 channelsを介してのみ名前を受け取ることができますが、引用されたプロセスも送信できます。 式<-
左側への割り当ては名前パターンであり、この例では@text
であり、結果の名前は引用されたプロセスであり、このプロセスをフリーテキスト変数に関連付けることを意味します。for
操作も同様for
動作します。1つのメッセージのみを読み取り、その後本文になり、各メッセージでそれ自体のコピーを呼び出しません。 この場合、何もせずに停止したNil
プロセスに変換します。原則として、chan
チャンネルのテキストを使用して他の操作を実行できます。
状態変化
1 new MakeCell in { 2 // Makes a single cell in which you can store values 3 contract MakeCell(@init, get, set) = { 4 new valueStore in { 5 valueStore!(init) | 6 contract get(ack) = { 7 for(@value <- valueStore) { 8 valueStore!(value) | ack!(value) 9 } 10 } | 11 contract set(@newValue, ack) = { 12 for(_ <- valueStore) { 13 valueStore!(newValue) | ack!(true) 14 } 15 } 16 } 17 } | 18 // Cell usage. 19 new myGet, mySet in { 20 MakeCell!(123, *myGet, *mySet) | 21 new ack in { 22 myGet!(*ack) | 23 for (@result <- ack) { 24 //result now contains the value 123 25 mySet!(456, *ack) | 26 for (_ <- ack) { 27 myGet!(*ack) | 28 for (@result <- ack) { 29 //result now contains the value 456 30 Nil 31 } 32 } 33 } 34 } 35 } 36 }
- 新しい
MakeCell
チャネルを作成し、3行目で内部コントラクトの名前として使用します。 このレキシカル環境のコード以外のプロセスが原因となることはありません。 -
MakeCell
コントラクトには3つの引数が必要です。 最初の引数は、このセルに含まれる値です。 2番目と3番目は、セルが読み取りおよび書き込み要求を受信するチャネルです。 最初の引数はプロセスであり、2番目と3番目は名前であることに注意してください。 名前は常にチャネルを介して送信されるため、最初の引数は@
で始まるパターンになります。これは、結果の名前が引用されたプロセスであり、このプロセスを変数に関連付けることを示します。 - 値を保存するために、新しいチャネルを作成します。 このチャネルには、セルの現在の値である最大1つの値が含まれます。
- この行の前の
valueStore
チャネルにはメッセージはありません。 初期値を設定した後、この値はこのチャネルの唯一の値になります。 - リーディングチャンネルでリッスンする契約を開始します。 メッセージを受信するたびに、コントラクトの本文が実行されます。
-
valueStore
チャネルでメッセージを受信するまで、契約をブロックします。valueStore
チャネルは1つのメッセージしか期待できないため、メッセージの読み取りは一種のロックです。 - 現在の値を再び
valueStore
チャネルにvalueStore
、他のメッセージの処理を開いてブロックを削除します。 ここで、現在の値をack
チャネルのクライアントに渡します。 - getコントラクトと並行して、セットでリッスンするコントラクトを実行します。
-
valueStore
メッセージが表示されるまでブロックし、それを読み取ります。 読んだメッセージを捨てます。 - 新しい値を
valueStore
チャネルのストレージに送信し、操作が完了したことを示すシグナルを送ります。
- 18-36)セルの作成、初期値
123
設定、この値の読み取り、値456
設定、この値の取得を示すコード。
呼び出しの対象となるレイヤーの深さに注意してください。 Poは同期コンピューティングを記述するために特別に設計されたため、他の言語では言うまでもなく、アクションの順序を明示的に示す必要があります。
おわりに
Poはブロックチェーンで使用するために作成された言語ですが、ノード、名前空間、ウォレット、Revとphlogiston、ネットワーク構造、またはCasperコンセンサスアルゴリズムのデバイスにはまだ到達していません。
完全なチュートリアル 。