Формальная проверка смарт-контрактов 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
Итак,это серьезный вопрос,и я думаю,что есть много людей более квалифицированных,чем я,но я дам вам некоторые предварительные рекомендации.
В книге Software Foundations о Coq говорится о подразумеваемом языке под названием Imp. Imp имеет такой синтаксис:
Z ::= X;; Y ::= 1;; WHILE ~(Z = 0) DO Y ::= Y * Z;; Z ::= Z - 1 END
Что можно легко понять как присваивание и простой цикл.
::=
предназначен для присваивания,цикл while до тех пор,пока z не станет 0. В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 и скомпилировать их для Майкельсона,но это всего лишь возможность,и я не видел никаких доказательств его построения.
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
Какие анализы смарт-контрактов Tezos могут принести наибольшую пользу разработчикам децентрализованных приложений?
Для ясности,под «анализом» я подразумеваю «статический анализ программы».См.,Например, здесь .
По сути,идея заключалась бы в том,что перед фиксацией смарт-контракта в цепочке нужно было бы выполнить статический анализ либо исходного кода высокого уровня,либо,альтернативно,непосредственно цели компиляции вmichelson,чтобы оценить различные свойства выполнения программы./p>