Verificação formal de contratos inteligentes de Tezos
2 respostas
- votos
-
- 2019-01-31
Se concordarmos que o objetivo das análises éparaprovarpropriedadese ajudar os usuários de contratosinteligentes aentendê-los,eu diria:
- .
- valores:estudando quais valores cadaelemento do armazenamentopode assumir ofuturo.
- Efeitos:estudando quaisefeitospodem ocorrernofuturo:tipicamente quaistransferênciaspodem ocorrere em quais condições.
- propriedade: quempode desencadear umamudançaem queparte do armazenamento.
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.
-
Uma versãobastante longa desta resposta: https://link.medium.com/ru9idrdepuA rather long version of this answer: https://link.medium.com/ru9idRDePU
- 2
- 2019-03-06
- FFF
-
- 2019-01-31
Entãoesta é uma questãoenormee acho que hámuitaspessoasmais qualificadas queeu,mas vou oferecer alguma orientaçãoinicial.
em fundações de software,um livro sobre COQ,elesfalam sobre uma linguagemimplícita chamada Imp. Imptem uma sintaxe como:
Z ::= X;; Y ::= 1;; WHILE ~(Z = 0) DO Y ::= Y * Z;; Z ::= Z - 1 END
Qual deve ser umpoucofacilmente compreendido como atribuiçãoe algum loop simples.
::=
épara atribuição,um loop while até z é 0. No Python,isso seria:def foo(x): z = x y = 1 while z != 0: y = y * z z -= 1
Podemosentão definirparte da lógica subjacentepara os símbolos. Porexemplo,
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.
Isso definirá as operações aritméticas.
Vocêtambémpode analisarpalavras reservadas,como:
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).
Então vocêpodemapear oprogramaparaessestipos definidosem COQ,como:
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))))))
Podemosentãofazer algumasprovas sobre asfunções ou declaraçõesfeitasnesta linguagem usando a lógicaformal. Aquiestá umexemploprovando que,se Znãofor 4,então Xnão é 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.
Agoraespero que opedido de um contratointeligente seja umpouco aparente. Se vocêpudesse abstrair o contratointeligenteem COQ,vocêpoderia usar COQparaprovar alguns componentes do seu contratointeligente rigorosamente. Hátambémpotencialpara delinear condições de um contratointeligenteem COQe compilá-lopara Michelson,masisso é apenas umapossibilidadee eunão vinenhumaevidência de sua construção.
ref: https://softwarefoundations.cis.upenn.edu/lf- atual/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
-
Obrigadopela resposta detalhada.Parece que vocêestáexplicando amim umaestratégia de * Como *fazer contratosinteligentespassíveis de análiseformal,aqui usando COQ.Eu acho queminhaperguntafoimaisfocadaem quetipos de resultados/garantiasestãonainterseção do que é atingívelpor análiseestáticae desejo de umaperspectiva de aplicação deblockchain.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
-
Seessa é apergunta,vocêpoderia apenas construir umfuzzer.Contratostêmentradasmuito rígidas,entãonão seriamuito difícilexperimentar umagrande variedade deinsumose ver as respostas dadas.https://en.wikipedia.org/wiki/fuzzing.if 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 Eu sinto que os contratosinteligentes devem viverem ummundo adversáriotão simplesferramentas de depuração,como osfocospodemnão ser suficientes.@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
-
Você semprepodefazermais,mas considerando as restriçõesmuito rigorosas sobreinsumos quetestes Fuzz de uma variedade de contratos adversáriosprovavelmente cobririam umgrandenúmero de cenáriospossíveis.Eu acho que um cenário de honeypot comona solidez seriamaisfácil detestare mais difícil de orquestrar,já quetodas as chamadasexternas acontecem após a conclusão do contrato.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
Quais são as análises dos contratosinteligentes de Tezos quepodembeneficiarmais osescritos do Dapps?
Apenaspara ser claro,por "análise" aqui quero dizer "Análise deprogramasestáticos".Veja,porexemplo, aqui .
Basicamente,aideia seria que antes de cometer um contratointeligentepara a cadeia,um realizaria uma análiseestáticano códigofonte de altonível ou,alternativamente,diretamente o alvo de compilaçãoem Michelson,afim de avaliar váriaspropriedades detempo deexecução doprograma.
.