むヌサリアムブロックチェヌンコヌルシステム

挑戊する

䞀元化された゜リュヌション






むヌサリアムスマヌトコントラクトの開発者は、䞀芋単玔な問題に盎面するこずがよくありたす-将来たたはスケゞュヌルでスマヌトコントラクトコヌドを呌び出す。 しかし、適切な解決策はなく、契玄を呌び出すための別個のサヌビスを開発する必芁がありたす。



MyWishプラットフォヌム甚の連絡先テンプレヌトを開発する際、すぐにこの制限に盎面したした。 そしお、この制限を「矎しく」回避するずいう目暙を、分散型゜リュヌションの助けを借りお蚭定したした。 このシステムは契玄を運甚する必芁があるため、英囜の物理孊者James Jouleに敬意を衚しお、Jouleず名付けるこずにしたした。



この蚘事では、ゞュヌルの開発、システムの基瀎を圢成した゜リュヌション、および埗られた結果に぀いおお話したいず思いたす。 開発はある皋床革新的であり、適甚される゜リュヌションはHabrの芖聎者にずっお興味深く有甚であるず信じおいたす。



゜リュヌションを説明する前に、Ethereumブロックチェヌンスマヌトコントラクトに関する基本的なこずを䌝える必芁がありたす。



スマヌトコントラクト



むヌサリアムスマヌトコントラクトは、 EVM むヌサリアム仮想マシン環境で実行されるプログラムです。 このような各契玄には、䞀意のアドレス、残高゚ヌテル、ステヌタス読み取り専甚メモリ、および呌び出しに䜿甚可胜なたたは機胜なしの関数のセットがありたす。



契玄のコヌド、残高、ステヌタスはブロックチェヌンに保存されたす。



ナヌザヌは、トランザクションを䜿甚しおコントラクト関数を呌び出すこずができたす。 たたは、関数が契玄たたは他の誰かの残高の状態を倉曎しない堎合、トランザクションなし。



契玄の方法は、耇雑で、実装が任意であり、各指瀺を完了するために必芁なガスによっおのみ制限されたす。 契玄は残高を倉曎したり、他の契玄を参照したり、他のネットワヌク参加者から資金を受け取るこずができたす。



むヌサリアムは、ナヌザヌだけが契玄呌び出しでネットワヌク䞊でトランザクションを開始できるように配眮されおいたす。 たずえば、コントラクトが機胜するために、特定の瞬間にメ゜ッドを呌び出す必芁がある堎合、ナヌザヌはこれを心配する必芁がありたす。



コヌルシステム



最初の明らかな解決策は、適切なタむミングでネットワヌクにトランザクションを公開するサヌビスです。



䞀元化された゜リュヌション

この゜リュヌションには倧きな欠点がありたす-それは集䞭型゜リュヌションです。 たずえば、サヌビスが配眮されおいるサヌバヌで䜕かが発生した堎合、支払いが行われないために切断されたり、眰金が科されるなど、呌び出しは行われたせん。 そのため、契玄は履行されず、受け入れられたせん。



この欠点を回避するために、私たちのチヌムはスマヌトコントラクトに基づいお実装されるゞュヌルシステムを発明したした。



ゞュヌル



Jouleは、 Ethereumネットワヌク䞊のスマヌトコントラクトであり、特定の時点で任意のコントラクトぞの呌び出しを登録できたす。 Jouleは、Ethereumナヌザヌが登録枈みの契玄を呌び出す機胜を提䟛したす。



ネットワヌク参加者が電話をかけるように動機付けるために、報酬ずボヌナスが支払われたす。これらは、電話が登録されたずきに蚭定されたす。 報酬に必芁な金額の蚈算はゞュヌルを行いたす。 報酬の額は、通話に費やされたガスの費甚を完党に賄いたす。 ボヌナスパヌツの圢で、 WISHトヌクンは通話に察しお支払われたす珟圚のバヌゞョンでは実装されおいたせん。



システムでは、倚くの契玄コヌルを同じタむムスタンプで蚘録できたす。 たた、異なる時間に同じ契玄を登録できたす。 唯䞀の制限は、完党に同䞀のパラメヌタヌセット契玄䜏所、時間、ガスおよびガス䟡栌で登録するこずができないこずです。



Jouleは 、むヌサリアムネットワヌク契玄ず同様に、耇数のナヌザヌが同時に自分自身に電話をかけるこずを蚱可したす。 そしお、コヌルに利甚可胜な契玄よりも倚くのJouleぞのコヌルがあるかもしれたせん。 この堎合、最初の発信者のみが報酬を受け取りたす。



ナヌザヌはスマヌトコントラクトメ゜ッドたたはWebむンタヌフェむスを䜿甚しおい぀でも、どのコントラクトがコヌルキュヌにあり、どの時点でこのコヌルを行う必芁があるかを知るこずができたす。 契玄の履行に必芁な報酬ずガスの量もゞュヌル契玄から入手できたす。



Jouleは、登録䞭に指定された時間たでに契玄が呌び出されないこずを保蚌し、呌び出しの順序を乱すこずを蚱可したせん。



実装の技術的困難



Jouleのような耇雑な契玄を䜜成するには、倚数の技術的な問題を解決する必芁がありたす。 これらのタスクの1぀は、さたざたな契玄䜏所ずその呌び出し時間およびその他のパラメヌタヌを保存するこずです。 キュヌにある最初の1぀を取埗しおコントラクトを呌び出すこずは、䞀定時間システムに登録されおいるコントラクトの数に関係なく行う必芁がありたす。



最小のガス消費で、アルゎリズムの遞択の必芁性の開発における远加の困難。 たずえば、アルゎリズムの耇雑さを超える゜リュヌションを適甚するこずはできたせん Olnn 。 ガスのコストに加えお、ガスの数にはただ制限がありたす。 たずえば、耇雑なアルゎリズムを䜿甚しお次の芁玠を怜玢する堎合 On/2 、各芁玠の怜玢には50,000個のガスが必芁になりたす。185個の芁玠を远加するず、契玄では怜玢できなくなりたす珟圚のトランザクションあたり4,600,000個のガス制限。



解決策



この章では、Jouleシステムに含たれる䞻芁な技術゜リュヌションに぀いお説明したす。



レコヌド構造



状態残高を陀くを保存するために、契玄はKey-Valueストレヌゞにアクセスできたす。 リポゞトリのキヌには、任意の256ビット数を䜿甚できたす。 実際、保存する前に、EVMはkeccaksha-3アルゎリズムを䜿甚しおキヌチェックサムを蚈算したす。 倀は256ビットの数倀でもありたすコンパむラヌは、オフセットパラメヌタヌをキヌに远加するこずにより、倀をより倧きな状態にするこずができたす。 したがっお、コントラクトはそれぞれ256ビットの2 ^ 256個の䞀意の倀を栌玍できたす。これは、ニヌズよりも桁違いに倧きくなりたす。



キヌ倀ストレヌゞは、2 ^ 256次元のランダムアクセスメモリ領域ず芋なすこずができたす。 この堎合、キヌはメモリロケヌションぞの参照です。 コヌル登録を保存するために必芁なデヌタ構造は、契玄の䜏所、契玄コヌルの時間、契玄をコヌルするのに必芁なガスの量、およびガスコストのフィヌルドで構成されたす。 このデヌタはすべお256ビット32バむトに収たりたす。



レコヌド構造



制限事項



このデヌタストレヌゞ構造を䜿甚しお、いく぀かの制限を受け入れる必芁がありたす。





レコヌドチェヌンストレヌゞ



スマヌトコントラクトは、デヌタセットを栌玍するための2぀の構造をサポヌトしたす。むンデックスによるアクセスを持぀配列ず、キヌによるアクセスを持぀マッピングです。 ただし、実際には配列はマッピングずしお栌玍されたす。キヌはむンデックスであり、アクセス速床に利点はありたせん。 さらに、配列の䞭倮に芁玠を挿入するには、すべおの芁玠をシフトする必芁があり、これには蚱容できない量のガスが必芁になる堎合がありたす。 したがっお、リンクリストに基づく゜リュヌションは、このタスクにより適しおいたす。



リストを比率で保存するために、次のテクノロゞヌが䜿甚されたす。レコヌド倀32バむトは、次の倀ぞのキヌたたは、C ++蚀語ずの類䌌性を匕き出す堎合のリンクず芋なされたす。



レコヌドチェヌン



巊の画像は、登録レコヌドRずキヌ取埗機胜を瀺しおいたす KR=R 倀のチェヌンの圢で。 右偎には、テヌブル圢匏のキヌず倀のストレヌゞがありたす。 倀が芋られたす K0 次の倀ぞの唯䞀のキヌであるずいう事実のために倱われたす。 契玄では、比率からキヌを読み取る方法はありたせん。 これを行うために、テヌブルにはヌル゚ントリヘッドが含たれおいたす。これは垞にチェヌンの先頭の倀を瀺したす。



チェヌン内の゚ントリの順序は時系列の逆で、呌び出される次の契玄を即座に受け取りたす。 同じ登録時刻が远加順に次々ず䞊べられたす。



玢匕



登録のリストを゜ヌト順に維持するには、日付に埓っお゚ントリを挿入する必芁がありたす。 新しい倀を挿入する堎所の怜玢を高速化するために、ツリヌベヌスのむンデックスが開発されたした。



暹朚



このアプロヌチでは、ツリヌ内の芁玠を怜玢するず、dev内の芁玠の数に䟝存しない䞀定の倀の耇雑さが埗られたす O1 。 より悪いシナリオがあり、珟圚の実装では168回の怜玢です。 ツリヌのバランスは、レベルず芁因の数を倉曎するこずで遞択できたす。



前のレベルず同様の最埌のレベルには、最倧タむムスタンプず最小タむムスタンプの倀が含たれたす。



配眮ずコンポヌネント



ブロックチェヌン内の契玄のコヌドは倉曎できたせん。 そしお、倉曎の堎合には、契玄の新しいバヌゞョンを配眮する必芁がありたす。 同時に、デヌタ状態は叀いバヌゞョンから転送する必芁がありたす。 接觊状態は倖郚からアクセスできないため、これは必ずしも簡単ではありたせん。 たた、契玄に最初に状態にアクセスする機胜がない堎合、転送はほずんど䞍可胜になりたす。 州ず同様に、事前に準備された機胜がなければ、契玄からの資金を移すこずはできたせん。



これらの問題を解決するために、 Joule契玄はいく぀かの個別の契玄に分割されおいたす。



構造



Joule゚コシステムは、次の契玄で構成されおいたす。





このアヌキテクチャにより、デヌタを倱うこずなくJouleロゞックを倉曎できたす。 デヌタを転送たたはコピヌする必芁はありたせん。 資金を転送するメカニズムを䜜成する必芁はありたせんハッカヌ攻撃に察しお脆匱である可胜性がありたす。



プロキシコントラクトを䜿甚するず、倖郚開発者向けのJouleシステムずの統合が簡単になりたす。 Jouleで倉曎が発生した堎合、契玄の䜏所を倉曎する必芁はありたせん。 登録された契玄で、呌び出しがJouleからのものであるこずを確認する方が簡単です。



䜿甚する



このパヌトでは、結果のシステムの䜿甚方法に぀いお説明したす。



マむニング



アドレスを持ち、電話をかけるのに十分な資金を持぀ネットワヌクナヌザヌは、 Jouleで資金を増やすこずができたす。



これを行うには、適切なタむミングでJoule  invokeたたはinvokeOnceメ゜ッド を呌び出しおトランザクションを䜜成するだけで十分です。 トランザクション䞭に、 Jouleは 、契玄の登録時に予玄された呌び出し元に報酬を転送したす。



呌び出しが行われるべき瞬間は、 getTopメ゜ッドを䜿甚しお簡単に決定できたす。 このメ゜ッドは、 ゞュヌルのキュヌの珟圚の状態を返したす最も近いコヌルの時間、最小ガス、各契玄の報酬額、およびその他の倀。



マむナヌによっお瀺されるトランザクションごずのガスの量は、最も近い契玄のinvokeGasフィヌルドで指定された倀以䞊でなければなりたせん。 ガスは予備で割り圓おるこずができたす-未䜿甚のガスは返還されたす資金は匕き萜ずされたせん。 実行キュヌに呌び出しの準備ができおいるいく぀かのコントラクトがある堎合がありたす。 この堎合、すべおの契玄のガスの合蚈に等しいガスを蚭定するこずをお勧めしたす。 次に invokeメ゜ッドの堎合、1぀のトランザクションで耇数のコントラクトが呌び出され、マむナヌはそれぞれの報酬を受け取りたす。



契玄を登録するずきに、開発者はガスのコストの掚定倀を蚭定したすただし、少なくずも指定された倀以䞊。 電話をかけるには、鉱倫はそのようなガスの倀を遞択しお、トランザクションが他のトランザクション存圚する堎合よりも速く通過するようにしたすが、報酬の金額よりも高くはありたせん。 ガスコストの倀ず報酬の量は、 getTopメ゜ッドを䜿甚しお芋぀けるこずができたす。



コヌルが成功した堎合、 JouleはInvokedむベントを公開したす。これにより、成功したすべおのコヌルを怜玢し、報酬の正確な金額を確認できたす。



契玄の登録



䜕らかの目的で、指定された時間に契玄の呌び出しを受信する必芁がある堎合、この問題の最善の解決策はJouleです。



特定の時間の契玄呌び出しを登録するには、次のパラメヌタヌを指定しおregisterメ゜ッドを呌び出す必芁がありたす。





トランザクションでは、 登録コヌルずずもに、コヌルに報いるために金額を゚ヌテルで転送する必芁がありたす。 正確な金額は、 getPriceメ゜ッドを䜿甚しお芋぀けるこずができたす。 超過額が送金された堎合、残高は発呌者に返還されたす。



コントラクトはcheckメ゜ッドを実装する必芁がありたす。 時期尚早の呌び出しが契玄のロゞックに違反したり、脆匱性を䜜成したりする可胜性がある堎合は、呌び出しがJouleからのものであるこずを確認する必芁がありたす。 契玄がすでにオンラむンであり、 チェックメ゜ッドを远加する方法がない堎合、目的のメ゜ッドを実装し、タヌゲットコントラクトを呌び出す䞭間コントラクトを䜿甚できたす。 次に、 Jouleに登録するずきに、䞭間契玄の䜏所を瀺す必芁がありたす。



登録が成功した堎合、 Jouleは登録枈みむベントを公開したす。これにより、すべおの登録を確認できたす。



䞡方のタむプの盞互䜜甚は、 Ethereumネットワヌククラむアントを介しお、 ParityたたはGethMistなどのコントラクトを䜿甚しお盎接実装できたす。



たた、䟿宜䞊、 JouleにはWebむンタヌフェむスがあり、 メタマスクなどの拡匵機胜がむンストヌルされたブラりザヌのみを䜿甚しお、 MEWを介しお電話をかけたり契玄を登録したりできたす。



おわりに



その結果、スマヌトコントラクトのプラットフォヌム制限を回避できる゜リュヌションになりたす。ナヌザヌの盎接参加なしに、指定された時間にコントラクトを呌び出すこずができたす。



Jouleコヌドはgithubで入手できたす。



All Articles