Tezosスマートコントラクトのフォーマル検証
2 回答
- 投票
-
- 2019-01-31
分析の目的がプロパティを証明し、スマートコントラクトのユーザーがそれらを理解するのを助けることであることに同意する場合、私はこう言います:
- 値:ストレージの各要素が将来どのような値を取ることができるかを調査します.
- 効果:将来どのような影響が発生する可能性があるかを調査します.通常、どのような転送がどのような条件で発生する可能性がありますか.
- 所有権:ストレージのどの部分で変更をトリガーできるのか.
If we agree that the purpose of analyses is to both prove properties and help users of smart contracts to understand them, I would say:
- Values: studying what values each element of the storage can take in the future.
- Effects: studying what effects can occur in the future: typically what transfers can occur and on what conditions.
- Ownership: who can trigger a change on what part of the storage.
-
この回答のかなり長いバージョン:https://link.medium.com/ru9idRDePUA rather long version of this answer: https://link.medium.com/ru9idRDePU
- 2
- 2019-03-06
- FFF
-
- 2019-01-31
これは大きな質問であり、私よりも資格のある人はたくさんいると思いますが、最初のガイダンスを提供します.
Coqに関する本であるSoftwareFoundationsで、彼らはImpと呼ばれる暗黙の言語について話します. Impの構文は次のとおりです.
Z ::= X;; Y ::= 1;; WHILE ~(Z = 0) DO Y ::= Y * Z;; Z ::= Z - 1 END
これは、割り当てといくつかの単純なループとしてある程度簡単に理解できるはずです.
::=
は代入用で、zが0になるまでwhileループを実行します.Pythonでは次のようになります.def foo(x): z = x y = 1 while z != 0: y = y * z z -= 1
次に、シンボルの基礎となるロジックのいくつかを定義できます.たとえば、
Fixpoint aeval (a : aexp) : nat := match a with | ANum n ⇒ n | APlus a1 a2 ⇒ (aeval a1) + (aeval a2) | AMinus a1 a2 ⇒ (aeval a1) - (aeval a2) | AMult a1 a2 ⇒ (aeval a1) * (aeval a2) end.
これは算術演算を定義します.
次のように予約語を解析することもできます:
Inductive com : Type := | CSkip | CBreak (* <--- NEW *) | CAss (x : string) (a : aexp) | CSeq (c1 c2 : com) | CIf (b : bexp) (c1 c2 : com) | CWhile (b : bexp) (c : com).
次に、次のように、プログラムをCoqで定義されたこれらの型にマップできます.
CSeq (CAss Z X) (CSeq (CAss Y (S O)) (CWhile (BNot (BEq Z O)) (CSeq (CAss Y (AMult Y Z)) (CAss Z (AMinus Z (S O))))))
次に、形式論理を使用して、この言語で作成された関数またはステートメントについていくつかの証明を行うことができます.これは、zが4でない場合、xが2ではないことを証明する例です.
Example ceval_example1: empty_st =[ X ::= 2;; TEST X ≤ 1 THEN Y ::= 3 ELSE Z ::= 4 FI ]⇒ (Z !-> 4 ; X !-> 2). Proof. (* We must supply the intermediate state *) apply E_Seq with (X !-> 2). - (* assignment command *) apply E_Ass. reflexivity. - (* if command *) apply E_IfFalse. reflexivity. apply E_Ass. reflexivity. Qed.
これまでに、スマートコントラクトへの適用がある程度明らかになることを願っています.スマートコントラクトをCoqに抽象化できれば、Coqを使用して、スマートコントラクトのいくつかのコンポーネントを厳密に証明できます. Coqのスマートコントラクトの条件を概説し、それをMichelsonにコンパイルする可能性もありますが、それは単なる可能性であり、その構築の証拠は見ていません.
ref: https://softwarefoundations.cis.upenn.edu/lf- current/Imp.html
So this is a huge question and I think there are many people more qualified than me, but I'll offer some initial guidance.
In Software Foundations, a book on Coq, they talk about an implied language called Imp. Imp has a syntax like:
Z ::= X;; Y ::= 1;; WHILE ~(Z = 0) DO Y ::= Y * Z;; Z ::= Z - 1 END
Which should be somewhat easily understood as assignment and some simple looping.
::=
is for assignment, a while loop until z is 0. In python this would be:def foo(x): z = x y = 1 while z != 0: y = y * z z -= 1
We can then define some of the underlying logic for the symbols. For example,
Fixpoint aeval (a : aexp) : nat := match a with | ANum n ⇒ n | APlus a1 a2 ⇒ (aeval a1) + (aeval a2) | AMinus a1 a2 ⇒ (aeval a1) - (aeval a2) | AMult a1 a2 ⇒ (aeval a1) * (aeval a2) end.
This will define arithmetic operations.
You could also parse out reserved words, like:
Inductive com : Type := | CSkip | CBreak (* <--- NEW *) | CAss (x : string) (a : aexp) | CSeq (c1 c2 : com) | CIf (b : bexp) (c1 c2 : com) | CWhile (b : bexp) (c : com).
Then you could map the program to these defined types in Coq, like:
CSeq (CAss Z X) (CSeq (CAss Y (S O)) (CWhile (BNot (BEq Z O)) (CSeq (CAss Y (AMult Y Z)) (CAss Z (AMinus Z (S O))))))
We can then make some proofs about the functions or statements made in this language using formal logic. Here is an example proving that if z is not 4, then x is not 2:
Example ceval_example1: empty_st =[ X ::= 2;; TEST X ≤ 1 THEN Y ::= 3 ELSE Z ::= 4 FI ]⇒ (Z !-> 4 ; X !-> 2). Proof. (* We must supply the intermediate state *) apply E_Seq with (X !-> 2). - (* assignment command *) apply E_Ass. reflexivity. - (* if command *) apply E_IfFalse. reflexivity. apply E_Ass. reflexivity. Qed.
By now I hope the application to a smart contract is somewhat apparent. If you could abstract the smart contract into Coq, you could use Coq to prove some components of your smart contract rigorously. There is also potential to outline conditions of a smart contract in Coq and compile it to Michelson, but that's just a possibility and I haven't seen any evidence of its construction.
ref: https://softwarefoundations.cis.upenn.edu/lf-current/Imp.html
-
詳細な回答をありがとう.ここではCoqを使用して、スマートコントラクトを正式な分析に適したものにする*方法*の戦略を説明しているようです.私の質問は、静的分析によって達成可能であり、ブロックチェーンアプリケーションの観点から望ましいものの交差点にあるどのような結果/保証に焦点を当てていたと思います.Thanks for the detailed answer. It seems you are explaining to me a strategy of *how* to make smart contracts amenable to formal analysis, here by using Coq. I guess my question was more focused on what sorts of results/guarantees are at the intersection of of what is achieveable by static analysis and desireable from a blockchain application perspective.
- 0
- 2019-01-31
- Ezy
-
それが問題なら、ファザーを作るだけでいいのです.契約には非常に厳格な入力があるため、さまざまな入力を試して、与えられた応答を確認することはそれほど難しくありません.https://en.wikipedia.org/wiki/Fuzzingif that's the question, you could just build a fuzzer. Contracts have very rigid inputs so it wouldn't be too hard to try a wide variety of inputs and see the responses given. https://en.wikipedia.org/wiki/Fuzzing
- 0
- 2019-02-01
- Rob
-
@Robスマートコントラクトは敵対的な世界に存在しなければならないので、ファザーのような単純なデバッグツールでは不十分かもしれません.@Rob I feel that smart contracts must live in an adversarial world so simple debugging tools such are fuzzers might not be enough.
- 1
- 2019-02-02
- FFF
-
常にもっと多くのことを行うことができますが、さまざまな敵対契約からの入力ファジングテストに対する非常に厳しい制約を考慮すると、おそらく多数の可能なシナリオをカバーするでしょう.堅実なハニーポットのシナリオは、すべての外部呼び出しが契約の完了後に行われるため、テストが容易で、調整が難しいと思います.you could ALWAYS do more, but considering the very strict constraints on inputs fuzz testing from a variety of adversarial contracts would probably cover a large number of possible scenarios. I think a honeypot scenario like in solidity would be easier to test for and harder to orchestrate since all external calls happen after the contract's completion.
- 0
- 2019-02-02
- Rob
dappsライターに最も利益をもたらす可能性のあるTezosスマートコントラクトの分析は何ですか?
明確にするために、ここでの「分析」とは「静的プログラム分析」を意味します.たとえば、こちらをご覧ください.
基本的には、チェーンにスマートコントラクトをコミットする前に、プログラムのさまざまなランタイムプロパティを評価するために、高レベルのソースコード、または代わりにmichelsonのコンパイルターゲットに対して静的分析を実行するという考え方です.