Ịmepụta usoro nkwenye nkịtị site na ọkọ. Nkebi 1: Igwe mebere agwa na PHP na Python

Nkwenye n'ụdị bụ nkwenye nke otu mmemme ma ọ bụ algọridim site na iji ọzọ.

Nke a bụ otu n'ime ụzọ kachasị ike nke na-enye gị ohere ịchọta adịghị ike na mmemme ma ọ bụ gosi na ha adịghị.

Enwere ike ịhụ nkọwa zuru ezu nke nkwenye nkịtị na ihe atụ nke idozi nsogbu nke Wolf, ewu na kabeeji na edemede m gara aga.

N'isiokwu a, m na-esi na nkwenye nkwenye nke nsogbu gaa na mmemme ma kọwaa otú
kedu ka esi agbanwe ha ka ọ bụrụ usoro iwu iwu na-akpaghị aka.

Iji mee nke a, edere m analog nke m nke igwe mebere, na-eji ụkpụrụ ihe atụ.

Ọ na-atụgharị koodu mmemme wee tụgharịa ya n'ime usoro nha anya (SMT), nke enwere ike idozi ya na mmemme.

Ebe ọ bụ na a na-ewepụta ozi gbasara mgbako ihe atụ na ịntanetị n'ụzọ dị nkenke,
M ga-akọwa nkenke ihe ọ bụ.

Mgbakọ ihe atụ bụ ụzọ isi mee mmemme n'otu oge n'ọtụtụ data ma bụrụkwa ihe bụ isi maka nkwenye mmemme.

Dịka ọmụmaatụ, anyị nwere ike ịtọ ọnọdụ ntinye ebe arụmụka nke mbụ nwere ike were ụkpụrụ ọ bụla dị mma, nke abụọ adịghị mma, efu nke atọ, na arụmụka mmepụta, dịka ọmụmaatụ, 42.

Ngụkọta ihe atụ n'otu ọsọ ga-enye anyị azịza ma ọ ga-ekwe omume anyị nweta nsonaazụ achọrọ yana ihe atụ nke usoro ntinye ntinye dị otú ahụ. Ma ọ bụ gosi na enweghị paramita dị otú ahụ.

Ọzọkwa, anyị nwere ike ịtọ arụmụka ntinye aka na ndị niile nwere ike ime, ma họrọ naanị ndị mmepụta, dịka ọmụmaatụ, paswọọdụ nchịkwa.

N'okwu a, anyị ga-ahụ adịghị ike nke mmemme ahụ ma ọ bụ nweta ihe akaebe na paswọọdụ onye nchịkwa dị mma.

Enwere ike ịhụ na ogbugbu oge gboo nke mmemme nwere data ntinye akọwapụtara bụ ihe pụrụ iche nke ogbugbu ihe atụ.

Ya mere, agwa m VM nwekwara ike ịrụ ọrụ na ụdị nṅomi nke igwe mebere ọkọlọtọ.

Na nkọwa na isiokwu gara aga onye nwere ike ịhụ nkatọ ziri ezi nke nkwenye nkwenye na mkparịta ụka nke adịghị ike ya.

Nsogbu ndị bụ isi bụ:

  1. Mgbawa ngwakọta, ebe nkwenye nkịtị na-agbadata P=NP
  2. Ịhazi oku na sistemụ faịlụ, netwọkụ na nchekwa mpụga ndị ọzọ siri ike ịchọpụta
  3. chinchi na nkọwapụta, mgbe ndị ahịa ma ọ bụ programmer zubere otu ihe, ma ọ bụghị na-akọwa ya n'ụzọ ziri ezi zuru ezu na teknuzu nkọwapụta.

N'ihi ya, a ga-enyocha mmemme ahụ ma gbasoo nkọwapụta, mana ọ ga-eme ihe dị iche kpamkpam na ihe ndị okike tụrụ anya ya.

Ebe ọ bụ na n'isiokwu a, m na-atụlekarị iji nkwenye nkwenye na-eme ihe, agaghị m agba isi m megide mgbidi maka ugbu a, ma họrọ usoro ebe mgbagwoju anya algorithmic na ọnụ ọgụgụ nke oku mpụga dị ntakịrị.

Ebe ọ bụ na nkwekọrịta smart dabara nke ọma ihe ndị a chọrọ, nhọrọ ahụ dabara na nkwekọrịta RIDE site na ikpo okwu Waves: ha adịghị agwụ agwụ, na mgbagwoju anya ha nwere oke.

Mana anyị ga-atụle ha naanị site na akụkụ teknụzụ.

Na mgbakwunye na ihe niile, nkwenye nkịtị ga-abụ nke a na-achọkarị maka nkwekọrịta ọ bụla: ọ naghị ekwe omume imezi njehie nkwekọrịta mgbe emechara ya.
Na ọnụ ahịa nke njehie ndị dị otú ahụ nwere ike ịdị oke elu, ebe ọ bụ na a na-echekwa nnukwu ego na nkwekọrịta smart.

Edere igwe mebere ihe atụ m na PHP na Python, ma na-eji Z3Prover sitere na nyocha Microsoft iji dozie usoro SMT na-esi na ya pụta.

N'isi ya bụ ọchụchọ dị ike nke multi-transaction, nke
na-enye gị ohere ịchọta ngwọta ma ọ bụ adịghị ike, ọ bụrụgodị na ọ chọrọ ọtụtụ azụmahịa.
Ọbụna Akụkọ ifo, Otu n'ime usoro ihe atụ kachasị ike maka ịchọta adịghị ike Ethereum, gbakwunyere ike a ọnwa ole na ole gara aga.

Ma ọ dị mma ịmara na nkwekọrịta ether dị mgbagwoju anya na Turing zuru ezu.

PHP na-atụgharị koodu isi mmalite nke nkwekọrịta smart RIDE ka ọ bụrụ edemede Python, nke ewepụtara mmemme ahụ dị ka usoro nkwekọrịta dakọtara Z3 SMT na ọnọdụ maka mgbanwe ha:

Ịmepụta usoro nkwenye nkịtị site na ọkọ. Nkebi 1: Igwe mebere agwa na PHP na Python

Ugbu a, m ga-akọwa ihe na-eme n'ime n'ụzọ zuru ezu karị.

Mana nke mbụ, okwu ole na ole gbasara asụsụ nkwekọrịta smart RIDE.

Ọ bụ asụsụ mmemme na-arụ ọrụ na nke dabere na ume ume site na imewe.
RIDE na-agba ọsọ iche n'ime blockchain ma nwee ike iweghachite ma dee ozi sitere na nchekwa jikọtara na obere akpa onye ọrụ.

Ị nwere ike itinye nkwekọrịta RIDE na obere akpa ọ bụla, na nsonaazụ nke ogbugbu ga-abụ naanị EZIOKWU ma ọ bụ Ụgha.

EZIOKWU pụtara na smart nkwekọrịta na-ekwe ka azụmahịa, na Ụgha pụtara na ọ machibidoro ya.
Ọmụmaatụ dị mfe: edemede nwere ike machibido mbufe ma ọ bụrụ na itule obere akpa erughị 100.

Dịka ọmụmaatụ, m ga-ewere otu Wolf, Ewu, na Cabbage, mana ewepụtala m n'ụdị nkwekọrịta smart.

Onye ọrụ agaghị enwe ike ịdọrọ ego na obere akpa nke nkwekọrịta ahụ ruo mgbe o zigara onye ọ bụla n'akụkụ nke ọzọ.

#Извлекаем положение всех объектов из блокчейна
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 buru ụzọ wepụta mgbanwe niile na nkwekọrịta smart n'ụdị igodo ha yana mgbanwe okwu Boolean kwekọrọ.

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 wee gbanwee ha ka ọ bụrụ nkọwa usoro Z3Prover SMT dakọtara na Python.
A na-ekechi data ahụ na akaghị aka, ebe nchekwa nchekwa na-enweta index i, mgbanwe mgbanwe mgbanwe index i + 1, na mgbanwe ndị nwere okwu na-edozi iwu maka mgbanwe site na steeti gara aga gaa na nke ọzọ.

Nke a bụ nnọọ obi igwe mebere anyị, nke na-enye usoro nchọta ọtụtụ azụmahịa.

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

A na-ahazi ọnọdụ ndị ahụ wee tinye n'ime ndebiri edemede emebere iji kọwaa usoro SMT na Python.

Ndebiri oghere


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


Maka steeti ikpeazụ n'ime agbụ dum, a na-etinye iwu ndị akọwapụtara na ngalaba azụmahịa mbufe.

Nke a pụtara na Z3Prover ga-achọ kpọmkwem ụdị ọnọdụ ndị a ga-emesị kwe ka ewepụrụ ego na nkwekọrịta ahụ.

N'ihi ya, anyị na-enweta na-akpaghị aka ụdị SMT nke nkwekọrịta anyị.
Ị nwere ike ịhụ na ọ dị nnọọ ka ihe nlereanya site na edemede m gara aga, nke m ji aka chịkọta.

Ndebiri emecha


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


Mgbe emechara ya, Z3Prover na-edozi nkwekọrịta smart wee nye anyị usoro azụmahịa nke ga-enye anyị ohere iwepu ego:

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

Na mgbakwunye na nkwekọrịta ụgbọ mmiri, ị nwere ike ịnwale nkwekọrịta nke gị ma ọ bụ gbalịa ihe atụ a dị mfe, nke edozi na azụmahịa 2.

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

}

Ebe ọ bụ na nke a bụ ụdị nke mbụ, syntax dị oke oke ma enwere ike ịnwe ahụhụ.
N'isiokwu ndị na-esonụ, m na-eme atụmatụ ikpuchi n'ihu mmepe nke VM, na-egosi otú ị nwere ike ịmepụta n'ụzọ doro anya smart contracts na enyemaka ya, na ọ bụghị naanị dozie ha.

Igwe mebere agwa agwa dị na http://2.59.42.98/hyperbox/
Mgbe etinyere koodu isi mmalite nke VM ihe atụ ma tinye nkọwa n'ebe ahụ, m na-eme atụmatụ itinye ya na GitHub maka ohere efu.

isi: www.habr.com

Tinye a comment