Fausia se faiga fa'amaonia aloaia mai le amataga. Vaega 1: Masini Fa'amatalaga Fa'apitoa ile PHP ma le Python

Fa'amaoniga aloa'ia o le fa'amaoniga lea o le tasi polokalame po'o le algorithm e fa'aoga ai le isi.

O se tasi lea o auala sili ona malosi e mafai ai ona e suʻeina faʻafitauli uma i totonu o se polokalame pe faʻamaonia e le o iai.

O se fa'amatalaga auiliili o fa'amaoniga aloa'ia e mafai ona va'aia i le fa'ata'ita'iga o le fo'ia o le fa'afitauli o Luko, 'oti, ma Kapisi i la'u tusiga muamua.

I lenei tusiga ou te alu ese mai le faʻamaonia aloaia o faʻafitauli i polokalame ma faʻamatalaina pe faʻafefea
e fa'afefea ona fa'aliliuina i faiga fa'atulafonoina otometi.

Ina ia faia lenei mea, sa ou tusia laʻu lava analogue o se masini komepiuta, e faʻaaoga ai faʻavae faʻatusa.

E fa'avasega le fa'ailoga o le polokalame ma fa'aliliu i se faiga fa'atusa (SMT), lea e mafai ona fo'ia fa'apolokalame.

Talu ai o faʻamatalaga e uiga i faʻatusatusaga faʻatusa o loʻo tuʻuina atu i luga o le Initaneti i se vaega faʻapitoa,
O le a ou faamatalaina puupuu pe o le a.

Fa'ailoga fa'atusa o se auala e fa'atino ai i le taimi e tasi se polokalame i luga o le tele o fa'amaumauga ma o le meafaigaluega autu mo le fa'amaoniaina o polokalame aloaia.

Mo se faʻataʻitaʻiga, e mafai ona tatou faʻatulagaina tulaga faʻaoga e mafai ai e le finauga muamua ona ave soʻo se tulaga lelei, o le lona lua le lelei, lona tolu zero, ma le faʻamatalaga o galuega, mo se faʻataʻitaʻiga, 42.

O faʻatusatusaga faʻatusa i le tasi taʻavale o le a maua ai le tali pe mafai ona tatou maua le manaʻoga ma se faʻataʻitaʻiga o se seti o ia mea faʻaoga. Po'o le fa'amaoniga e leai ni fa'ailoga fa'apea.

E le gata i lea, e mafai ona tatou setiina faʻamatalaga tuʻufaʻatasia i mea uma e mafai, ma filifili naʻo mea e fai, mo se faʻataʻitaʻiga, le password administrator.

I lenei tulaga, o le a matou mauaina uma faʻafitauli o le polokalama poʻo le mauaina o faʻamaoniga e saogalemu le faʻaupuga a le pule.

E mafai ona maitauina o le faʻatinoina masani o se polokalame faʻatasi ai ma faʻamatalaga faʻapitoa faʻapipiʻi o se tulaga faʻapitoa o faʻataʻitaʻiga faʻatusa.

O le mea lea, o laʻu amio VM e mafai foi ona galue i le faʻataʻitaʻiga o se masini faʻapitoa masani.

I faʻamatalaga i le tusiga muamua e mafai e se tasi ona maua se faitioga talafeagai o le faʻamaonia aloaia ma se talanoaga o ona vaivaiga.

O faafitauli autu o:

  1. Pa'u tu'ufa'atasi, talu ai o fa'amaoniga aloa'ia e o'o mai i lalo i le P=NP
  2. O le faʻaogaina o telefoni i le faila faila, fesoʻotaʻiga ma isi mea e teu ai fafo e sili atu ona faigata ona faʻamaonia
  3. Bugs i le faʻamatalaga, pe a faʻamoemoe le tagata faʻatau poʻo le programmer se mea se tasi, ae leʻi faʻamatalaina saʻo i le faʻamatalaga faʻapitoa.

O se taunuuga, o le polokalama o le a faʻamaonia ma tausisia le faʻamatalaga, ae o le a faia se mea e matua ese lava mai mea na faʻamoemoeina e le au foafoa.

Talu ai i lenei tusiga o loʻo ou mafaufau tele i le faʻaogaina o le faʻamaoniga aloaia i le faʻatinoga, o le a ou le tuʻi loʻu ulu i luga o le puipui mo le taimi nei, ma o le a filifilia se faiga e laʻititi ai le lavelave algorithmic ma le numera o telefoni i fafo.

Talu ai o konekarate atamai e sili ona fetaui ma nei manaʻoga, o le filifiliga na pa'ū i luga o konekarate RIDE mai le Waves platform: latou te leʻi maeʻa Turing, ma o latou lavelave aupito maualuga e faʻatapulaʻaina.

Ae o le a tatou iloiloina naʻo latou mai le itu faʻapitoa.

I le faʻaopoopoga i mea uma, o le faʻamaoniga aloaia o le a sili ona manaʻomia mo soʻo se konekarate: e masani lava e le mafai ona faʻasaʻo se mea sese konekarate pe a uma ona faʻalauiloa.
Ma o le tau o ia mea sese e mafai ona maualuga tele, talu ai o le tele o tupe e masani ona teuina i luga o konekarate atamai.

O la'u masini fa'atusa fa'atusa o lo'o tusia i le PHP ma le Python, ma fa'aaoga le Z3Prover mai le Su'esu'ega a Microsoft e fo'ia ai fua fa'atatau SMT.

I lona autu o se suʻesuʻega tele-transaction mamana, lea
fa'atagaina oe e su'e fofo po'o fa'aletonu, tusa lava pe mana'omia le tele o fefa'atauaiga.
E oo lava i le Mythril, o se tasi o faʻataʻitaʻiga faʻatusa sili ona malosi mo le sailia o faʻafitauli o le Ethereum, naʻo le faʻaopoopoina o lenei gafatia i nai masina talu ai.

Ae e taua le matauina o konekarate eter e sili atu ona faigata ma ua maeʻa Turing.

PHP fa'aliliuina le code source o le RIDE smart contract i se python script, lea o lo'o tu'uina atu ai le polokalame o se faiga e fetaui ma le Z3 SMT o setete ma aiaiga mo a latou suiga:

Fausia se faiga fa'amaonia aloaia mai le amataga. Vaega 1: Masini Fa'amatalaga Fa'apitoa ile PHP ma le Python

O lea o le a ou faʻamatalaina mea o loʻo tupu i totonu i le auiliiliga.

Ae muamua, o nai upu e uiga i le gagana konekarate atamai RIDE.

Ose gagana fa'apolokalame fa'atino ma fa'aaliga e paie ile mamanu.
O le RIDE e alu ese i totonu o le poloka poloka ma e mafai ona toe aumai ma tusi faʻamatalaga mai le teuina e fesoʻotaʻi ma le atotupe a le tagata faʻaoga.

E mafai ona e fa'apipi'i se konekarate RIDE i atotupe ta'itasi, ma o le fa'ai'uga o le fa'ataunu'uina o le a na'o le MONI po'o le SESE.

TRUE o lona uiga o le konekarate atamai e faʻatagaina le fefaʻatauaiga, ma le FALSE o lona uiga e faʻasaina.
O se fa'ata'ita'iga faigofie: e mafai e se fa'amaumauga ona fa'asa le tu'uina atu pe afai o le paleni atotupe e itiiti ifo i le 100.

Mo se faʻataʻitaʻiga, o le a ou ave le Wolf, Goat, ma Cabbage, ae ua uma ona tuʻuina atu i le tulaga o se konekarate atamai.

O le a le mafai e le tagata faʻaoga ona aveese tupe mai le atotupe o loʻo tuʻuina atu ai le konekarate seia oʻo ina ia auina atu tagata uma i le isi itu.

#Извлекаем положение всех объектов из блокчейна
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

}

O le PHP muamua e aveese uma fesuiaiga mai le konekarate atamai i foliga o latou ki ma le fesuiaiga o le Boolean expression talafeagai.

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 ona liua lea i latou ile Z3Prover SMT-compatible system description ile Python.
O faʻamaumauga o loʻo afifiina i totonu o se matasele, lea e maua ai e le teuina o fesuiaiga le faasino igoa i, fesuiaiga o fefaʻatauaiga i + 1, ma fesuiaiga ma faʻamatalaga e seti ai tulafono mo le suiga mai le setete muamua i le isi.

O le fatu tonu lea o la tatou masini komepiuta, lea e maua ai se masini su'esu'e tele-transactional.

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] )  

O tu'utu'uga e fa'avasega ma fa'aofi i totonu o se fa'ata'ita'iga fa'asologa e fa'amatala ai le SMT system i le Python.

Fa'ata'ita'iga avanoa


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()
 


Mo le setete mulimuli i le filifili atoa, o tulafono o loʻo faʻamaonia i le vaega o fefaʻatauaiga o fefaʻatauaiga e faʻaaogaina.

O lona uiga o le Z3Prover o le a su'e tonu ia seti o aiaiga e iu ai ina fa'atagaina tupe e aveese mai le konekarate.

O le i'uga, e otometi lava ona matou maua se fa'ata'ita'iga SMT atoatoa o le matou konekarate.
E mafai ona e vaʻai e talitutusa lava ma le faʻataʻitaʻiga mai laʻu tusiga muamua, lea na ou tuufaatasia ma le lima.

Fa'ata'ita'iga ua mae'a


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()
 


A maeʻa le faʻalauiloaina, ua foia e le Z3Prover le konekarate atamai ma tuʻuina mai ia i matou se filifili o fefaʻatauaiga e mafai ai ona matou faaui i tua tupe:

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

I le faaopoopo atu i le konekarate vaʻa, e mafai ona e faʻataʻitaʻi i au lava konekarate pe faʻataʻitaʻi lenei faʻataʻitaʻiga faigofie, lea e foia i le 2 fefaʻatauaiga.

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

}

Talu ai o le lomiga muamua lea, o le syntax e matua faʻatapulaʻa ma e ono iai ni faʻailoga.
I tala o loʻo mulimuli mai, ou te fuafua e faʻapipiʻi le faʻalauteleina o le VM, ma faʻaalia pe faʻapefea ona e faia ni konekarate atamai faʻamaonia aloaia ma lana fesoasoani, ae le na o le foia.

O lo'o maua le masini fa'akomepiuta uiga i http://2.59.42.98/hyperbox/
A maeʻa ona tuʻuina le faʻailoga autu o le VM faʻatusa ma faʻaopoopo faʻamatalaga iina, ou te fuafua e tuʻu i luga ole GitHub mo avanoa saoloto.

puna: www.habr.com

Faaopoopo i ai se faamatalaga