Kugadzira yakarongeka verification system kubva kutanga. Chikamu 1: Hunhu Virtual Machine muPHP nePython

Formal verification ndeyekusimbisa kwechimwe chirongwa kana algorithm uchishandisa imwe.

Iyi ndiyo imwe yenzira dzakasimba kwazvo dzinokutendera kuti uwane kusagadzikana kwese muchirongwa kana kuratidza kuti havapo.

Tsanangudzo yakadzama yekusimbisa zviri pamutemo inogona kuonekwa mumuenzaniso wekugadzirisa dambudziko re Mhumhi, Mbudzi, uye Kabheji munyaya yangu yapfuura.

Muchinyorwa ichi ini ndinosimuka kubva kune yakarongeka yekusimbisa matambudziko kuenda kumapurogiramu uye ndinotsanangura sei
vangashandurwa sei kuva hurongwa hwekutonga huri nyore.

Kuti ndiite izvi, ndakanyora yangu analogue yemuchina chaiwo, ndichishandisa misimboti yekufananidzira.

Inopatsanura kodhi yepurogiramu uye inoishandura kuita system of equations (SMT), iyo inogona kutogadziriswa nehurongwa.

Sezvo ruzivo nezve maverengero ekufananidzira anoratidzwa paInternet pane zvidimbu,
Ndichatsanangura muchidimbu kuti chii.

Symbolic computation inzira yekuita panguva imwe chete chirongwa pane dzakasiyana siyana data uye ndicho chishandiso chikuru chekusimbisa chirongwa.

Semuenzaniso, tinokwanisa kuseta mamiriro ekuisa apo nharo yekutanga inogona kutora chero hunhu hwakanaka, yechipiri isina kunaka, yechitatu zero, uye inobuda nharo, semuenzaniso, 42.

Kuverengera kwechiratidzo mukumhanya kumwe kunozotipa mhinduro yekuti zvinokwanisika here kuti isu tiwane mhedzisiro yatinoda uye muenzaniso weiyo seti yemaparamendi ekuisa akadaro. Kana humbowo hwekuti hakuna maparameter akadaro.

Uyezve, isu tinogona kuseta mapomendi ekuisa kune ese anogoneka, uye tosarudza chete izvo zvinobuda, semuenzaniso, password yemutungamiriri.

Mune ino kesi, isu tichawana kusakwana kwese kwechirongwa kana kuwana humbowo hwekuti password yemutungamiriri yakachengeteka.

Zvinogona kucherechedzwa kuti classical execution yechirongwa ine chaiyo yekupinza data inyaya yakakosha yekuurayiwa kwekufananidzira.

Naizvozvo, hunhu hwangu VM hunogonawo kushanda mukutevedzera modhi yemuchina wakajairwa.

Mune zvakataurwa kuchinyorwa chakapfuura munhu anogona kuwana kutsoropodza kwakaringana kwekusimbisa kwakarongeka nehurukuro yekusasimba kwayo.

Matambudziko makuru ndeaya:

  1. Combinatorial kuputika, sezvo kusimbiswa kwechokwadi kunozodzika kuP = NP
  2. Kugadzirisa mafoni kune iyo faira system, network uye kumwe kuchengetedza kwekunze kwakanyanya kunetsa kuratidza
  3. Mabhugi mune yakatarwa, apo mutengi kana programmer aida chinhu chimwe chete, asi haana kurondedzera icho nemazvo zvakakwana muhunyanzvi hwekutsanangurwa.

Nekuda kweizvozvo, chirongwa ichi chinozosimbiswa uye chinoenderana nezvakatsanangurwa, asi chichaita chimwe chinhu chakasiyana zvachose kubva kune izvo vagadziri vaitarisira kubva kwairi.

Sezvo muchinyorwa chino ini ndiri kunyanya kufunga nezve kushandiswa kwechokwadi kwechokwadi mukuita, ini handisi kuzorovera musoro wangu kumadziro ikozvino, uye ndichasarudza hurongwa uko iyo algorithmic kuoma uye nhamba yekufona kwekunze kushoma.

Sezvo zvibvumirano zvakangwara zvichinyatsoenderana nezvinodiwa izvi, sarudzo yakawira paRIDE zvibvumirano kubva paMafungu papuratifomu: ivo havasi Turing yakakwana, uye kuoma kwavo kwakanyanya kunogumira.

Asi isu tichavafunga ivo chete kubva kudivi rehunyanzvi.

Mukuwedzera, kune chero zvibvumirano zvibvumirano zvakasimbiswa zvichange zvichinyanya kudiwa: kazhinji hazvibviri kugadzirisa kukanganisa kwekontrakiti mushure mokunge yatangwa.
Uye mutengo wezvikanganiso zvakadaro unogona kunge wakakwira zvakanyanya, sezvo mari yakawanda kwazvo inowanzochengetwa pazvibvumirano zvakangwara.

Muchina wangu wekufananidzira wakanyorwa muPHP nePython, uye unoshandisa Z3Prover kubva kuMicrosoft Research kugadzirisa mhedzisiro yeSMT mafomula.

Pakati payo pane simba rekutsvaga kwemarudzi akawanda, iyo
inokutendera iwe kuwana mhinduro kana kusasimba, kunyangwe zvichida akawanda matransaction.
Kunyange the Mythril, imwe yezvimiro zvine simba zvekufananidzira zvekutsvaga Ethereum vulnerabilities, yakawedzera kukwanisa uku mwedzi mishoma yapfuura.

Asi zvakakosha kucherechedza kuti ether zvibvumirano zvakanyanya kuoma uye Turing yakakwana.

PHP inoshandura iyo kodhi kodhi yeRIDE smart kontrakiti kuita python script, umo chirongwa chinoratidzwa seZ3 SMT-inoenderana system yezvibvumirano nyika uye mamiriro ekuchinja kwavo:

Kugadzira yakarongeka verification system kubva kutanga. Chikamu 1: Hunhu Virtual Machine muPHP nePython

Zvino ini ndichatsanangura zviri kuitika mukati zvakadzama.

Asi chekutanga, mazwi mashoma nezve RIDE smart contract mutauro.

Mutauro unoshanda uye wekutaura-wakavakirwa purogiramu ine usimbe nekugadzira.
RIDE inomhanya yakazvimiririra mukati me blockchain uye inogona kudzoreredza nekunyora ruzivo kubva mudura rakabatana nechikwama chemushandisi.

Iwe unogona kubatanidza RIDE kontrakiti kune yega yega chikwama, uye mhedzisiro yekuurayiwa ichave chete CHOKWADI kana FALSE.

TRUE zvinoreva kuti kondirakiti yakangwara inobvumira kutengeserana, uye FALSE zvinoreva kuti inoirambidza.
Muenzaniso wakapfava: script inogona kurambidza kutamiswa kana chikwama chemari chiri pasi pe100.

Semuenzaniso, ini ndichatora imwechete Wolf, Mbudzi, uye Kabheji, asi yakatoratidzwa nenzira yekontrakiti yakangwara.

Mushandisi haazokwanisi kubvisa mari kubva muchikwama icho chibvumirano chinoiswa kusvikira atumira munhu wese kune rumwe rutivi.

#ИзвлСкаСм ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°
let contract = tx.sender
let human= extract(getInteger(contract,"human"))
let wolf= extract(getInteger(contract,"wolf"))
let goat= extract(getInteger(contract,"goat"))
let cabbage= extract(getInteger(contract,"cabbage"))

#Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ называСмая Π΄Π°Ρ‚Π°-транзакция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ присылаСт Π½ΠΎΠ²Ρ‹Π΅ 4 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.
#ΠšΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ Π΅Ρ‘ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС Ссли всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ останутся Π² сохранности.
match tx {
case t:DataTransaction =>
   #ИзвлСкаСм Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
   let newHuman= extract(getInteger(t.data,"human")) 
   let newWolf= extract(getInteger(t.data,"wolf"))
   let newGoat= extract(getInteger(t.data,"goat"))
   let newCabbage= extract(getInteger(t.data,"cabbage"))
   
   #0 ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π° Π»Π΅Π²ΠΎΠΌ Π±Π΅Ρ€Π΅Π³Ρƒ, Π° 1 Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΎΠΌ
   let humanSide= human == 0 || human == 1
   let wolfSide= wolf == 0 || wolf == 1
   let goatSide= goat == 0 || goat == 1
   let cabbageSide= cabbage == 0 || cabbage == 1
   let side= humanSide && wolfSide && goatSide && cabbageSide

   #Π‘ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π³Π΄Π΅ с ΠΊΠΎΠ·ΠΎΠΉ Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚ Π² отсутствии Ρ„Π΅Ρ€ΠΌΠ΅Ρ€Π°.
   let safeAlone= newGoat != newWolf && newGoat != newCabbage
   let safe= safeAlone || newGoat == newHuman
   let humanTravel= human != newHuman 

   #Бпособы ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ Ρ„Π΅Ρ€ΠΌΠ΅Ρ€Π° Ρ‚ΡƒΠ΄Π° ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, с ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π»ΠΈΠ±ΠΎ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΡƒ.
   let t1= humanTravel && newWolf == wolf + 1 && newGoat == goat && newCabbage == cabbage 
   let t2= humanTravel && newWolf == wolf && newGoat == goat + 1 && newCabbage == cabbage
   let t3= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage + 1
   let t4= humanTravel && newWolf == wolf - 1 && newGoat == goat && newCabbage == cabbage
   let t5= humanTravel && newWolf == wolf && newGoat == goat - 1 && newCabbage == cabbage
   let t6= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage - 1
   let t7= humanTravel && newWolf == wolf && newGoat == goat && newCabbage == cabbage
   let objectTravel = t1 || t2 || t3 || t4 || t5 || t6 || t7
   
   #ПослСдняя строка Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ описываСт Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ условиС.
   #ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния 1 ΠΈΠ»ΠΈ 0, всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹
   #Π±Ρ‹Ρ‚ΡŒ Π² бСзопасности, Π° Ρ„Π΅Ρ€ΠΌΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΏΠ»Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡ΠΊΡƒ 
   #ΠΈΠ»ΠΈ с ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡˆΠ°Π³Ρƒ
   side && safe && humanTravel && objectTravel
case s:TransferTransaction =>
   #Вранзакция Π²Ρ‹Π²ΠΎΠ΄Π° срСдств Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС Ссли всС ΠΏΠ΅Ρ€Π΅ΠΏΠ»Ρ‹Π»ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π΅Ρ€Π΅Π³
   human == 1 && wolf == 1 && goat == 1 && cabbage == 1

#ВсС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹
case _ => false

}

PHP inotanga inobvisa zvese zvakasiyana kubva kune smart kontrakiti mumhando yemakiyi avo uye inoenderana Boolean kutaura kunosiyana.

cabbage: extract ( getInteger ( contract , "cabbage" ) )
goat: extract ( getInteger ( contract , "goat" ) )
human: extract ( getInteger ( contract , "human" ) )
wolf: extract ( getInteger ( contract , "wolf" ) )
fState: human== 1 && wolf== 1 && goat== 1 && cabbage== 1
fState: 
wolf: 
goat: 
cabbage: 
cabbageSide: cabbage== 0 || cabbage== 1
human: extract ( getInteger ( contract , "human" ) )
newGoat: extract ( getInteger ( t.data , "goat" ) )
newHuman: extract ( getInteger ( t.data , "human" ) )
goatSide: goat== 0 || goat== 1
humanSide: human== 0 || human== 1
t7: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage
t3: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage + 1
t6: humanTravel && newWolf== wolf && newGoat== goat && newCabbage== cabbage - 1
t2: humanTravel && newWolf== wolf && newGoat== goat + 1 && newCabbage== cabbage
t5: humanTravel && newWolf== wolf && newGoat== goat - 1 && newCabbage== cabbage
t1: humanTravel && newWolf== wolf + 1 && newGoat== goat && newCabbage== cabbage
t4: humanTravel && newWolf== wolf - 1 && newGoat== goat && newCabbage== cabbage
safeAlone: newGoat != newWolf && newGoat != newCabbage
wolfSide: wolf== 0 || wolf== 1
humanTravel: human != newHuman
side: humanSide && wolfSide && goatSide && cabbageSide
safe: safeAlone || newGoat== newHuman
objectTravel: t1 || t2 || t3 || t4 || t5 || t6 || t7

PHP inozovashandura kuita Z3Prover SMT-inoenderana sisitimu tsananguro muPython.
Iyo data yakaputirwa muloop, apo zvigadziriso zvekuchengetedza zvinogamuchira index i, transaction variables index i + 1, uye zvinyorwa zvine mazwi zvinogadzirisa mitemo yekushandura kubva kune imwe nyika kuenda kune inotevera.

Uyu ndiwo moyo chaiwo wemuchina wedu chaiwo, uyo unopa akawanda-transactional yekutsvaga injini.

fState:  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final:  fState[Steps] 
fState:   
wolf:   
goat:   
cabbage:   
cabbageSide:  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )  
goatSide:  Or( goat[i]  ==  0 , goat[i]  ==  1 )  
humanSide:  Or( human[i]  ==  0 , human[i]  ==  1 )  
t7:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t3:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] + 1 )  
t6:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] - 1 )  
t2:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage  ==  cabbage[i] )  
t5:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage  ==  cabbage[i] )  
t1:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
t4:  And( And( And( humanTravel[i] , wolf  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage  ==  cabbage[i] )  
safeAlone:  And( goat[i+1] != wolf , goat[i+1] != cabbage )  
wolfSide:  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )  
humanTravel:  human[i] != human[i+1] 
side:  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )  
safe:  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )  
objectTravel:  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )  
data:  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )  

Mamiriro acho anorongwa uye anoiswa mune script template yakagadzirirwa kutsanangura iyo SMT system muPython.

template isina chinhu


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

$code$



#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


Kumamiriro ekupedzisira mumaketani ose, mitemo inotsanangurwa muchikamu chekutengesa chekufambisa inoshandiswa.

Izvi zvinoreva kuti Z3Prover ichatsvaga seti chaiyo yemamiriro ezvinhu ayo anozopedzisira abvumira mari kubviswa muchibvumirano.

Nekuda kweizvozvo, isu tinongogashira inoshanda zvizere SMT modhi yekondirakiti yedu.
Iwe unogona kuona kuti yakafanana chaizvo nemuenzaniso kubva kuchinyorwa changu chakapfuura, chandakanyora nemaoko.

Yakapedzwa template


import json

from z3 import *

s = Solver()

  
  
    
Steps=7
Num= Steps+1

human = [ Int('human_%i' % (i + 1)) for i in range(Num) ]
wolf = [ Int('wolf_%i' % (i + 1)) for i in range(Num) ]
goat = [ Int('goat_%i' % (i + 1)) for i in range(Num) ]
cabbage = [ Int('cabbage_%i' % (i + 1)) for i in range(Num) ]
nothing= [  And( human[i] == human[i+1], wolf[i] == wolf[i+1], goat[i] == goat[i+1], cabbage[i] == cabbage[i+1] )   for i in range(Num-1) ]


start= [ human[0] == 1, wolf[0] == 0, goat[0] == 1, cabbage[0] == 0 ]

safeAlone= [  And( goat[i+1] != wolf[i+1] , goat[i+1] != cabbage[i+1] )   for i in range(Num-1) ]
safe= [  Or( safeAlone[i] , goat[i+1]  ==  human[i+1] )   for i in range(Num-1) ]
humanTravel= [  human[i] != human[i+1]  for i in range(Num-1) ]
cabbageSide= [  Or( cabbage[i]  ==  0 , cabbage[i]  ==  1 )   for i in range(Num-1) ]
goatSide= [  Or( goat[i]  ==  0 , goat[i]  ==  1 )   for i in range(Num-1) ]
humanSide= [  Or( human[i]  ==  0 , human[i]  ==  1 )   for i in range(Num-1) ]
t7= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t3= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] + 1 )   for i in range(Num-1) ]
t6= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] - 1 )   for i in range(Num-1) ]
t2= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] + 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t5= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] )  , goat[i+1]  ==  goat[i] - 1 )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t1= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] + 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
t4= [  And( And( And( humanTravel[i] , wolf[i+1]  ==  wolf[i] - 1 )  , goat[i+1]  ==  goat[i] )  , cabbage[i+1]  ==  cabbage[i] )   for i in range(Num-1) ]
wolfSide= [  Or( wolf[i]  ==  0 , wolf[i]  ==  1 )   for i in range(Num-1) ]
side= [  And( And( And( humanSide[i] , wolfSide[i] )  , goatSide[i] )  , cabbageSide[i] )   for i in range(Num-1) ]
objectTravel= [  Or( Or( Or( Or( Or( Or( t1[i] , t2[i] )  , t3[i] )  , t4[i] )  , t5[i] )  , t6[i] )  , t7[i] )   for i in range(Num-1) ]
data= [ Or(  And( And( And( side[i] , safe[i] )  , humanTravel[i] )  , objectTravel[i] )   , nothing[i]) for i in range(Num-1) ]


fState=  And( And( And( human[Steps]  ==  1 , wolf[Steps]  ==  1 )  , goat[Steps]  ==  1 )  , cabbage[Steps]  ==  1 )  
final=  fState 




#template, only start rest
s.add(data + start)

#template
s.add(final)




ind = 0

f = open("/var/www/html/all/bin/python/log.txt", "a")



while s.check() == sat:
  ind = ind +1
  

  print ind
  m = s.model()
  print m

  print "traversing model..." 
  #for d in m.decls():
	#print "%s = %s" % (d.name(), m[d])

  
 
  f.write(str(m))
  f.write("nn")
  exit()
  #s.add(Or(goat[0] != s.model()[data[0]] )) # prevent next model from using the same assignment as a previous model



print "Total solution number: "
print ind  

f.close()
 


Mushure mekutangwa, Z3Prover inogadzirisa kondirakiti yakangwara uye inotipa ketani yekutengeserana inozotibvumidza kubvisa mari:

Winning transaction chain found:
Data transaction: human= 0, wolf= 0, goat= 1, cabbage= 0
Data transaction: human= 1, wolf= 0, goat= 1, cabbage= 1
Data transaction: human= 0, wolf= 0, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 0, wolf= 1, goat= 0, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Data transaction: human= 1, wolf= 1, goat= 1, cabbage= 1
Transfer transaction

Pamusoro pechibvumirano chechikepe, unogona kuedza nezvibvumirano zvako pachako kana kuedza uyu muenzaniso wakapfava, unogadziriswa mukutengeserana kwe2.

let contract = tx.sender
let a= extract(getInteger(contract,"a"))
let b= extract(getInteger(contract,"b"))
let c= extract(getInteger(contract,"c"))
let d= extract(getInteger(contract,"d"))

match tx {
case t:DataTransaction =>
let na= extract(getInteger(t.data,"a")) 
let nb= extract(getInteger(t.data,"b"))
let nc= extract(getInteger(t.data,"c"))
let nd= extract(getInteger(t.data,"d"))
   
   nd == 0 || a == 100 - 5
case s:TransferTransaction =>
   ( a + b - c ) * d == 12

case _ => true

}

Sezvo iyi iri iyo yekutanga vhezheni, iyo syntax ishoma uye panogona kunge paine tsikidzi.
Muzvinyorwa zvinotevera, ini ndinoronga kuvhara kuenderera mberi kweVM, uye kuratidza kuti iwe unogona sei kugadzira zvakasimbiswa zvakasimbiswa smart zvibvumirano nerubatsiro rwayo, uye kwete kungozvigadzirisa.

Iyo character virtual muchina inowanikwa pa http://2.59.42.98/hyperbox/
Mushure mekuisa iyo kodhi kodhi yechiratidzo VM mukurongeka uye nekuwedzera makomendi ipapo, ndinoronga kuiisa paGitHub yemahara kuwana.

Source: www.habr.com

Voeg