rholang-分散システム用のプログラミング言語

RChainは、分散コンピューティングのブロックチェーンプラットフォームです。 イーサリアムのように、桁違いに高速です。 理論的には、無限にスケーリングできます。実際の最初の実装では、1秒あたり最大4万件のトランザクションを処理できます。 技術的な詳細はアーキテクチャ文書にあります。













RChainプラットフォームの契約はrholang言語で書かれており、 Habrの聴衆に紹介したいと思います。 dockerを介してRchainノードをダウンロードして実行するか、サイトのインタープリターを使用することにより、この言語でプログラムを作成して実行することができます







完全なチュートリアル



Rolang(または単にro )はプロセス指向の言語です。 それに関するすべての計算は、「 チャネル 」間でメッセージを送信することによって実行されます。 チャネルには複数のメッセージが保存されます。 Poは完全に非同期の言語であるため、 チャネルでメッセージを受信する順序は何の役割も果たしません。 たとえば、 チャネルからメッセージを読み取り、そのメッセージに対して何らかの操作を実行できます。 ただし、メッセージを送信して、メッセージの受信後に何かを行うことはできません。 少なくとも、配信確認メッセージの期待を個別に指定しない。 このチュートリアルでは、 名前チャンネルという用語を同義語として使用することに注意してください。 で rho rholangの基になっている代数では、 名前nameが使用されますが、彼らの助けを借りてデータを送受信できるので、それらは意味的にchannelと似ています







契約とデータ提出



1 contract @"HelloWorld"(return) = { 2 return!("Hello, World!") 3 } | 4 new myChannel in { 5 @"HelloWorld"!(*myChannel) 6 }
      
      







データ検索



 1 contract @"HelloAgain"(_) = { 2 new chan in { 3 chan!("Hello again, world!") | 4 for (@text <- chan) { Nil } 5 } 6 } | @"HelloAgain"!(Nil)
      
      







状態変化



  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 }
      
      





  1. 新しいMakeCell



    チャネルを作成し、3行目で内部コントラクトの名前として使用します。 このレキシカル環境のコード以外のプロセスが原因となることはありません。
  2. MakeCell



    コントラクトには3つの引数が必要です。 最初の引数は、このセルに含まれる値です。 2番目と3番目は、セルが読み取りおよび書き込み要求を受信するチャネルです。 最初の引数はプロセスであり、2番目と3番目は名前であることに注意してください。 名前は常にチャネルを介して送信されるため、最初の引数は@



    で始まるパターンになります。これは、結果の名前が引用されたプロセスであり、このプロセスを変数に関連付けることを示します。
  3. 値を保存するために、新しいチャネルを作成します。 このチャネルには、セルの現在の値である最大1つの値が含まれます。
  4. この行の前のvalueStore



    チャネルにはメッセージはありません。 初期値を設定した後、この値はこのチャネルの唯一の値になります。
  5. リーディングチャンネルでリッスンする契約を開始します。 メッセージを受信するたびに、コントラクトの本文が実行されます。
  6. valueStore



    チャネルでメッセージを受信するまで、契約をブロックします。 valueStore



    チャネルは1つのメッセージしか期待できないため、メッセージの読み取りは一種のロックです。
  7. 現在の値を再びvalueStore



    チャネルにvalueStore



    、他のメッセージの処理を開いてブロックを削除します。 ここで、現在の値をack



    チャネルのクライアントに渡します。
  8. getコントラクトと並行して、セットでリッスンするコントラクトを実行します。
  9. valueStore



    メッセージが表示されるまでブロックし、それを読み取ります。 読んだメッセージを捨てます。
  10. 新しい値をvalueStore



    チャネルのストレージに送信し、操作が完了したことを示すシグナルを送ります。




呼び出しの対象となるレイヤーの深さに注意してください。 Poは同期コンピューティングを記述するために特別に設計されたため、他の言語では言うまでもなく、アクションの順序を明示的に示す必要があります。







おわりに



Poはブロックチェーンで使用するために作成された言語ですが、ノード、名前空間、ウォレット、Revとphlogiston、ネットワーク構造、またはCasperコンセンサスアルゴリズムのデバイスにはまだ到達していません。







完全なチュートリアル








All Articles