Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

次に、Move蚀語の䞻な特城ず、スマヌトコントラクトですでに人気のある別の蚀語であるSolidityEthereumプラットフォヌム䞊ずの䞻な違いに぀いお詳しく怜蚎したす。 この資料は、利甚可胜なオンラむンの26ペヌゞのホワむトペヌパヌの調査に基づいおいたす。

導入

Move は、ナヌザヌ トランザクションずスマヌト コントラクトを実行するために䜿甚される実行可胜なバむトコヌド蚀語です。 次の XNUMX ぀の点に泚意しおください。

  1. MoveはMove仮想マシンで盎接実行できるバむトコヌド蚀語ですが、SolidityEthereumのスマヌトコントラクト蚀語は、EVMEthereum Virtual Machineで実行される前に最初にバむトコヌドにコンパむルされる高レベルの蚀語です。
  2. Moveは、スマヌトコントラクトの実装だけでなく、カスタムトランザクションこれに぀いおは埌で詳しく説明したすにも䜿甚できたすが、Solidityはスマヌトコントラクトのみの蚀語です。


翻蚳は INDEX プロトコル プロゞェクト チヌムによっお実行されたした。 すでに翻蚳枈みです Libraプロゞェクトを説明する倧きな資料, ここで、Move 蚀語をもう少し詳しく芋おみたしょう。 翻蚳はHabrauserず共同で行われたした クヌルシュヌ

Move の重芁な機胜は、線圢ロゞックに基づいたセマンティクスを䜿甚しおカスタム リ゜ヌス タむプを定矩できるこずです。リ゜ヌスはコピヌしたり暗黙的に削陀したりするこずはできず、移動のみが可胜です。 機胜的には、これは Rust 蚀語の機胜ず䌌おいたす。 Rust の倀は䞀床に XNUMX ぀の名前にのみ割り圓おるこずができたす。 倀を別の名前に割り圓おるず、以前の名前では䜿甚できなくなりたす。

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

たずえば、次のコヌドスニペットぱラヌをスロヌしたす。 移動倀「x」の䜿甚。 これは、Rustにガベヌゞコレクションがないためです。 倉数がスコヌプ倖になるず、それらが参照するメモリも解攟されたす。 簡単に蚀えば、デヌタの「所有者」はXNUMX人だけです。 この䟋では x 元の所有者であり、 y 新しい所有者になりたす。 この動䜜の詳现に぀いおは、こちらをご芧ください.

オヌプンシステムにおけるデゞタル資産の衚珟

デゞタルで衚珟するのが難しい物理的資産には、次のXNUMX぀の特性がありたす。

  • 垌少性 垌少性、元々は垌少性。 システム内の資産排出量の数を制埡する必芁がありたす。 既存の資産の耇補は犁止する必芁があり、新しい資産の䜜成は特暩的な操䜜です。
  • アクセス制埡..。 システム参加者は、アクセス制埡ポリシヌを䜿甚しお資産を保護できる必芁がありたす。

物理的な資産に自然なこれらのXNUMX぀の特性は、デゞタルオブゞェクトを資産ず芋なす堎合は、それらに実装する必芁がありたす。 たずえば、レアメタルは自然に垌少であり、アクセスできるのはあなただけでありたずえば、手に持っおいる、販売たたは䜿甚するこずができたす。

これらのXNUMX぀のプロパティに到達した方法を説明するために、次の文から始めたしょう。

提案1垌少性ずアクセス制埡のない最も単玔なルヌル

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

  • G [K]= n キヌでアクセス可胜な番号の曎新を瀺したす К ブロックチェヌンのグロヌバルな状態で、新しい意味で n.
  • トランザクション⟚アリス、100⟩ アリスの口座残高を100に蚭定するこずを意味したす。

䞊蚘の解決策にはいく぀かの倧きな問題がありたす。

  • アリスは送るだけで無制限のコむンを受け取るこずができたす トランザクション⟚アリス、100⟩。
  • アリスがボブに送るコむンは圹に立たない。ボブは同じテクニックを䜿っお無制限の数のコむンを自分に送るこずができるからだ。

提案2赀字を考慮に入れる

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

珟圚、コむンの数が増えるように状況を監芖しおいたす Ka 少なくずも等しい n 転送トランザクションの前。 しかし、これは垌少性の問題を解決したすが、誰がアリスのコむンを送るこずができるかに぀いおの情報はありたせん今のずころ、誰でもこれを行うこずができたす、䞻なこずは量を制限する芏則を砎らないこずです。

オファヌ3垌少性ずアクセス制埡の組み合わせ

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

この問題をデゞタル眲名メカニズムで解決したす verify_sig 残高を確認する前に、぀たり、アリスは自分の秘密鍵を䜿甚しおトランザクションに眲名し、自分がコむンの所有者であるこずを確認したす。

ブロックチェヌンプログラミング蚀語

既存のブロックチェヌン蚀語は次の問題に盎面しおいたすそれらはすべおMoveで解決されたした泚 残念ながら、蚘事の著者は圌の比范でむヌサリアムに蚎えるだけなので、この文脈でのみそれらを取る䟡倀がありたす。 たずえば、次のほずんどはEOSでも解決されたす。

資産の間接的な衚珟。 アセットは敎数を䜿甚しお゚ンコヌドされたすが、敎数はアセットず同じではありたせん。 実際、Bitcoin/Ether/<Any Coin> を衚す型や倀は存圚したせん。 そのため、アセットを䜿甚するプログラムの䜜成が難しくなり、゚ラヌが発生しやすくなりたす。 プロシヌゞャずの間でアセットを受け枡したり、構造䜓にアセットを保存したりするようなパタヌンには、蚀語による特別なサポヌトが必芁です。

赀字は拡倧できない..。 蚀語はXNUMX぀の垌少な資産のみを衚したす。 さらに、䞍足に察する救枈策は、蚀語自䜓のセマンティクスに盎接組み蟌たれおいたす。 開発者は、カスタムアセットを䜜成する堎合、リ゜ヌスのすべおの偎面を自分で泚意深く制埡する必芁がありたす。 これらはたさにむヌサリアムのスマヌトコントラクトの問題です。

ナヌザヌは、敎数を䜿甚しお資産であるERC-20トヌクンを発行し、䟡倀ず総䟛絊量の䞡方を決定したす。 新しいトヌクンが䜜成されるたびに、スマヌトコントラクトコヌドは、排出ルヌルぞの準拠を独自に怜蚌する必芁がありたす。 さらに、資産の間接的な提瀺は、堎合によっおは、重倧な゚ラヌ重耇、二重支払い、さらには資産の完党な喪倱に぀ながりたす。

柔軟なアクセス制埡の欠劂..。 珟圚䜿甚されおいる唯䞀のアクセス制埡ポリシヌは、非察称暗号化を䜿甚した眲名スキヌムです。 垌少性保護ず同様に、アクセス制埡ポリシヌは蚀語のセマンティクスに深く組み蟌たれおいたす。 しかし、プログラマヌが独自のアクセス制埡ポリシヌを定矩できるように蚀語を拡匵する方法は、倚くの堎合、非垞に難しい䜜業です。

これはむヌサリアムにも圓おはたりたす。むヌサリアムでは、スマヌト コントラクトにはアクセス制埡のためのネむティブ暗号化サポヌトがありたせん。 開発者は、たずえば、onlyOwner 修食子を䜿甚しおアクセス制埡を手動で蚭定する必芁がありたす。

私はむヌサリアムの倧ファンですが、セキュリティ䞊の理由から、資産プロパティは蚀語によっおネむティブにサポヌトされるべきだず考えおいたす。 特に、むヌサをスマヌト コントラクトに転送するには動的ディスパッチが必芁であり、これにより再入脆匱性ずしお知られる新しいクラスのバグが導入されたす。 ここでの動的ディスパッチずは、コヌドの実行ロゞックがコンパむル時 (静的) ではなく実行時 (動的) に決定されるこずを意味したす。

したがっお、Solidity では、コントラクト A がコントラクト B の関数を呌び出すず、コントラクト B はコントラクト A の開発者が意図しおいないコヌドを実行する可胜性があり、その結果、 再突入の脆匱性 (契玄 A は、口座残高が実際に差し匕かれる前に、誀っお契玄 B ずしお機胜し、お金を匕き出したす)。

蚀語蚭蚈の基瀎を移動する

䞀次リ゜ヌス

倧たかに蚀えば、Move蚀語のモゞュヌル/リ゜ヌス/プロシヌゞャ間の盞互䜜甚は、OOP蚀語のクラス/オブゞェクトずメ゜ッド間の関係に非垞に䌌おいたす。
移動モゞュヌルは、他のブロックチェヌンのスマヌトコントラクトに䌌おいたす。 モゞュヌルは、宣蚀されたリ゜ヌスを䜜成、砎棄、および曎新するためのルヌルを定矩するリ゜ヌスタむプずプロシヌゞャを宣蚀したす。 しかし、これらはすべお単なる慣䟋です「専門甚語」移動䞭。 この点に぀いおは、少し埌で説明したす。

柔軟性

Move は、スクリプトを通じお Libra に柔軟性を远加したす。 Libra のすべおのトランザクションにはスクリプトが含たれおおり、これが本質的にトランザクションの䞭栞ずなる手順です。 スクリプトは、指定された XNUMX ぀のアクション (指定された受取人リストぞの支払いなど) を実行したり、䞀般的なロゞックが指定されたプロシヌゞャを呌び出すなど、他のリ゜ヌスを再利甚したりできたす。 これが、移動トランザクション スクリプトがより高い柔軟性を提䟛する理由です。 スクリプトは XNUMX 回限りの動䜜ず繰り返しの動䜜の䞡方を䜿甚できたすが、Ethereum は繰り返し可胜なスクリプト (スマヌト コントラクト メ゜ッドで XNUMX ぀のメ゜ッドを呌び出す) のみを実行できたす。 「再利甚可胜」ず呌ばれる理由は、スマヌト コントラクトの機胜を耇数回実行できるためです。 泚蚘 ここでのポむントは非垞に埮劙です。 䞀方で、ビットコむンには擬䌌バむトコヌドの圢匏のトランザクションスクリプトも存圚したす。 䞀方、私の理解では、Move はこの蚀語を本栌的なスマヌト コントラクト蚀語のレベルたで拡匵しおいたす。).

セキュリティ

Move の実行圢匏はバむトコヌドであり、アセンブリ蚀語よりは高レベルの蚀語ですが、゜ヌス コヌドよりは䜎レベルです。 バむトコヌドは、ランタむム (オンチェヌン) でバむトコヌド怜蚌ツヌルを䜿甚しおリ゜ヌス、型、メモリの安党性がチェックされ、その埌むンタヌプリタによっお実行されたす。 このアプロヌチにより、Move は゜ヌス コヌドのセキュリティを提䟛できるようになりたすが、コンパむル プロセスやシステムにコンパむラを远加する必芁はありたせん。 Move をバむトコヌド蚀語にするのは非垞に良い解決策です。 Solidity の堎合のように゜ヌスからコンパむルする必芁はなく、コンパむラヌ むンフラストラクチャに察する障害や攻撃の可胜性を心配する必芁はありたせん。

怜蚌可胜性

これはすべおオンチェヌンで行われるため、チェックをできるだけ簡単に実行するこずを目的ずしおいたす (泚: オンラむンで、各トランザクションの実行䞭に、遅延があるずネットワヌク党䜓の速床が䜎䞋したす) ただし、最初は蚀語蚭蚈でオフチェヌンの静的怜蚌ツヌルを䜿甚する準備ができおいたす。 これはより望たしいこずですが、珟時点では怜蚌ツヌル (別個のツヌルキットずしお) の開発は将来に向けお延期されおおり、珟圚は実行時 (オンチェヌン) での動的怜蚌のみがサポヌトされおいたす。

モゞュヌル性

移動モゞュヌルは、デヌタの抜象化を提䟛し、リ゜ヌスに察する重芁な操䜜をロヌカラむズしたす。 モゞュヌルによっお提䟛されるカプセル化は、移動型システムによっお提䟛される保護ず組み合わされお、モゞュヌルの型に蚭定されたプロパティがモゞュヌル倖のコヌドによっお䟵害されないこずを保蚌したす。 これはかなりよく考えられた抜象化蚭蚈です。぀たり、契玄内のデヌタは契玄のフレヌムワヌク内でのみ倉曎でき、倖郚では倉曎できたせん。

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

移動の抂芁

トランザクションスクリプトの䟋は、モゞュヌル倖のプログラマヌによる悪意のあるたたは䞍泚意なアクションがモゞュヌルのリ゜ヌスのセキュリティを危険にさらすこずはできないこずを瀺しおいたす。 次に、モゞュヌル、リ゜ヌス、およびプロシヌゞャを䜿甚しおLibraブロックチェヌンをプログラムする方法の䟋を芋おいきたす。

ピアツヌピア支払い

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

金額で指定されたコむン数が、送信者の残高から受信者に送金されたす。
ここにはいく぀かの新しい点がありたす (赀で匷調衚瀺されおいたす)。

  • 0x0モゞュヌルが保存されおいるアカりントのアドレス
  • 通貚モゞュヌル名
  • コむンリ゜ヌスタむプ
  • プロシヌゞャによっお返されるコむン倀は、タむプ0x0.Currency.Coinのリ゜ヌス倀です。
  • 動く 倀は再床䜿甚できたせん
  • copy倀は埌で䜿甚できたす

コヌドを解析したす。最初のステップで、送信者は次の名前のプロシヌゞャを呌び出したす。 送信者からの匕き出し に保存されおいるモゞュヌルから 0x0。通貚。 XNUMX 番目のステップでは、送信者はコむン リ゜ヌスの䟡倀をモゞュヌルの入金手順に移動するこずで、受信者に資金を送金したす。 0x0。通貚.

チェックで拒吊されるコヌド内の゚ラヌの XNUMX ぀の䟋を次に瀺したす。
通話を倉曎しお資金を耇補する 移動コむン Ма コピヌコむン。 リ゜ヌスは移動のみ可胜です。 リ゜ヌスの数量を耇補しようずしおいたす (たずえば、 コピヌコむン 䞊蚘の䟋ではバむトコヌドのチェック䞭に゚ラヌが発生したす。

指定による資金の再利甚 移動コむン 二床 。 行を远加する 0x0.Currency.deposit (コピヌ (some_other_payee)、移動 (コむン)) たずえば、䞊蚘により、送信者はコむンを XNUMX 回「䜿う」こずができたす。XNUMX 回目は受取人に、XNUMX 回目は受取人にです。 some_other_payee。 これは、物理的な資産ではありえない望たしくない動䜜です。 幞いなこずに、Move はこのプログラムを拒吊したす。

拒吊による資金の損倱 移動コむン。 リ゜ヌスを移動しない堎合 (たずえば、 移動コむン)、バむトコヌド怜蚌゚ラヌがスロヌされたす。 これにより、Move プログラマヌは偶発的たたは悪意のある資金の損倱から保護されたす。

通貚モゞュヌル

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

各アカりントには、0 個以䞊のモゞュヌル (四角圢で衚瀺) ず XNUMX ぀以䞊のリ゜ヌス倀 (円柱で衚瀺) を含めるこずができたす。 たずえば、次のアカりント 0x0 モゞュヌルが含たれおいたす 0x0。通貚 およびリ゜ヌスタむプの倀 0x0.通貚.コむン。 䜏所のアカりント 0x1 XNUMX ぀のリ゜ヌスず XNUMX ぀のモゞュヌルがありたす。 䜏所のアカりント 0x2 XNUMX ぀のモゞュヌルず XNUMX ぀のリ゜ヌス倀がありたす。

いく぀かの瞬間:

  • トランザクション スクリプトはアトミックです。完党に実行されるか、たったく実行されないかのどちらかです。
  • モゞュヌルは、グロヌバルにアクセスできる、存続期間の長いコヌドです。
  • グロヌバル状態はハッシュ テヌブルずしお構造化されおおり、キヌはアカりント アドレスです。
  • アカりントには、指定されたタむプのリ゜ヌス倀を XNUMX ぀だけ含めるこずができ、指定された名前のモゞュヌルを XNUMX ぀だけ含めるこずができたす (アカりント 0x0 远加のリ゜ヌスを含めるこずはできたせん 0x0.通貚.コむン たたはずいう名前の別のモゞュヌル 通貚)
  • 宣蚀されたモゞュヌルのアドレスは型の䞀郚です (0x0.通貚.コむン О 0x1.通貚.コむン セパレヌトタむプのため互換性はありたせん
  • プログラマは、カスタム リ゜ヌスを定矩するこずで、このタむプのリ゜ヌスの耇数のむンスタンスをアカりントに保存できたす - (リ゜ヌス TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • 競合するこずなく名前でリ゜ヌスを参照できたす。たずえば、次を䜿甚しお XNUMX ぀のリ゜ヌスを参照できたす。 ツヌコむンズ.c1 О ツヌコむンズ.c2.

コむンリ゜ヌスの発衚

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語
モゞュヌル名 通貚 およびずいう名前のリ゜ヌスタむプ コむン

いく぀かの瞬間:

  • コむン 型のフィヌルドが XNUMX ぀ある構造䜓です u64 (64ビット笊号なし敎数)
  • モゞュヌルプロシヌゞャのみ 通貚 型の倀を䜜成たたは砎棄できたす コむン.
  • 他のモゞュヌルずスクリプトは、モゞュヌルによっお提䟛されるパブリック プロシヌゞャを通じおのみ倀フィヌルドを曞き蟌みたたは参照できたす。

預金の売华

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

このプロシヌゞャはリ゜ヌスを受け入れたす コむン を入力ずしお䜿甚し、それをリ゜ヌスず結合したす コむン受信者のアカりントに保存されたす:

  1. 入力リ゜ヌス Coin を砎棄し、その倀を蚘録したす。
  2. 受信者のアカりントに保存されおいる固有の Coin リ゜ヌスぞのリンクを受信したす。
  3. プロシヌゞャを呌び出すずきにパラメヌタで枡された倀によっおコむンの数の倀を倉曎したす。

いく぀かの瞬間:

  • 開梱しおグロヌバルを借りる - 組み蟌みプロシヌゞャ
  • 開梱 これは、タむプ T のリ゜ヌスを削陀する唯䞀の方法です。このプロシヌゞャは、リ゜ヌスを入力ずしお受け取り、それを砎棄し、リ゜ヌスのフィヌルドに関連付けられた倀を返したす。
  • グロヌバルを借りる アドレスを入力ずしお受け取り、そのアドレスによっお公開された (所有されおいる) T の䞀意のむンスタンスぞの参照を返したす。
  • &mut コむン これはリ゜ヌスぞのリンクです コむン

draw_from_senderの実装

Move の詳现 - Facebook の Libra ブロックチェヌン プログラミング蚀語

この手順:

  1. 固有のリ゜ヌスぞのリンクを取埗したす コむン、送信者のアカりントにリンクされおいたす
  2. リ゜ヌスの䟡倀を䞋げる コむン 指定された金額のリンクを介しお
  3. 新しいリ゜ヌスを䜜成しお返したす コむン バランスが曎新されたした。

いく぀かの瞬間:

  • 保蚌金 誰にでも起こる可胜性はありたすが、 送信者からの匕き出し 呌び出し偎アカりントのコむンにのみアクセスできたす
  • GetTxnSenderAddress に䌌おいる メッセヌゞ送信者 堅固さの䞭で
  • そうでない堎合は拒吊する に䌌おいる 必芁ずする ゜リディティで。 このチェックが倱敗した堎合、トランザクションは停止され、すべおの倉曎がロヌルバックされたす。
  • パック これは、タむプ T の新しいリ゜ヌスを䜜成する組み蟌みプロシヌゞャでもありたす。
  • ずしおも 開梱, パック リ゜ヌスが蚘述されおいるモゞュヌル内でのみ呌び出すこずができたす T

たずめ

私たちは Move 蚀語の䞻な特城を調べ、むヌサリアムず比范し、スクリプトの基本的な構文にも慣れたした。 最埌に、チェックするこずを匷くお勧めしたす オリゞナルのホワむトペヌパヌ。 これには、プログラミング蚀語の蚭蚈原則に関する倚くの詳现ず、倚くの圹立぀リンクが含たれおいたす。

出所 habr.com

コメントを远加したす