БъздаванС Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° систСма Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°. Част 1: Character VM Π² PHP ΠΈ Python

Π€ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π΅Π΄Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π΄Ρ€ΡƒΠ³Π°.

Π’ΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-ΠΌΠΎΡ‰Π½ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ всички уязвимости Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅, Ρ‡Π΅ Ρ‚Π΅ Π½Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚.

По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаниС Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с Π’ΡŠΠ»ΠΊ, ΠΊΠΎΠ·Π° ΠΈ Π·Π΅Π»Π΅ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΌΠΈ статия.

Π’ Ρ‚Π°Π·ΠΈ статия ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΌ ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° към ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ описвам ΠΊΠ°ΠΊ
ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ‚Π΅ Π² систСми ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π—Π° Π΄Π° направя Ρ‚ΠΎΠ²Π°, написах своя Π°Π½Π°Π»ΠΎΠ³ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π½Π° символни ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ.

Π’ΠΎΠΉ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° програмния ΠΊΠΎΠ΄ ΠΈ Π³ΠΎ ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π° Π² систСма ΠΎΡ‚ уравнСния (SMT), която Π²Π΅Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π΅ΡˆΠ΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½ΠΎ.

Въй ΠΊΠ°Ρ‚ΠΎ информацията Π·Π° символнитС изчислСния Π΅ прСдставСна Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ доста Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½ΠΎ,
Π©Π΅ опиша Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΊΠ°ΠΊΠ²ΠΎ прСдставлява.

Π‘ΠΈΠΌΠ²ΠΎΠ»Π½ΠΈΡ‚Π΅ изчислСния са Π½Π°Ρ‡ΠΈΠ½ Π·Π° Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ изпълнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π²ΡŠΡ€Ρ…Ρƒ ΡˆΠΈΡ€ΠΎΠΊ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΠΈ са основният инструмСнт Π·Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°.

НапримСр, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½ΠΈ условия, ΠΏΡ€ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½Π° стойност, вторият ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»Π½Π°, трСтият ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½ΡƒΠ»Π°, Π° изходният Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΅ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 42.

Π‘ΠΈΠΌΠ²ΠΎΠ»Π½ΠΈΡ‚Π΅ изчислСния Π² Π΅Π΄Π½ΠΎ изпълнСниС Ρ‰Π΅ Π½ΠΈ Π΄Π°Π΄Π°Ρ‚ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π΄Π°Π»ΠΈ Π΅ възмоТно Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ТСлания Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ²Π° Π²Ρ…ΠΎΠ΄Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Или доказатСлство, Ρ‡Π΅ няма Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.

ОсвСн Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π²Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ цяло ΠΊΠ°Ρ‚ΠΎ всички възмоТни ΠΈ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅ΠΌ само ΠΈΠ·Ρ…ΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π° администратора.

Π’ Ρ‚ΠΎΠ·ΠΈ случай Ρ‰Π΅ ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ΠΌ всички уязвимости Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° ΠΈΠ»ΠΈ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ доказатСлство, Ρ‡Π΅ ΠΏΠ°Ρ€ΠΎΠ»Π°Ρ‚Π° Π½Π° администратора Π΅ бСзопасна.

Π’ΠΈΠΆΠ΄Π° сС, Ρ‡Π΅ класичСското изпълнСниС Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π΅ частСн случай Π½Π° символна.

Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ моята Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π·Π° Π³Π΅Ρ€ΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° Смулация Π½Π° стандартна Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина.

Π’ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ към ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° статия ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΌΠ΅Ρ€ΠΈ ΠΈ справСдлива ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с обсъТданС Π½Π° Π½Π΅ΠΉΠ½ΠΈΡ‚Π΅ слабости.

ΠžΡΠ½ΠΎΠ²Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ са:

  1. ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ‚ΠΎΡ€Π½Π° Сксплозия, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка ΠΏΠΎΡ‡ΠΈΠ²Π° Π½Π° P=NP
  2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° повиквания към Ρ„Π°ΠΉΠ»ΠΎΠ²Π°Ρ‚Π° систСма, ΠΌΡ€Π΅ΠΆΠΈΡ‚Π΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎ външно Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΅ ΠΏΠΎ-Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°
  3. Π“Ρ€Π΅ΡˆΠΊΠΈ Π² спСцификацията, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡΡ‚ΡŠΡ‚ Π΅ замислил Π΅Π΄Π½ΠΎ Π½Π΅Ρ‰ΠΎ, Π½ΠΎ Π½Π΅ Π³ΠΎ Π΅ описал Ρ‚ΠΎΡ‡Π½ΠΎ Π² Π’Π—.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‰Π΅ бъдС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π° ΠΈ Ρ‰Π΅ отговаря Π½Π° спСцификацията, Π½ΠΎ Ρ‰Π΅ ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ съвсСм Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ са ΠΎΡ‡Π°ΠΊΠ²Π°Π»ΠΈ ΠΎΡ‚ нСя.

Въй ΠΊΠ°Ρ‚ΠΎ Π² Ρ‚Π°Π·ΠΈ статия Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌ основно ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, засСга няма Π΄Π° си удрям Ρ‡Π΅Π»ΠΎΡ‚ΠΎ Π² стСната ΠΈ Ρ‰Π΅ ΠΈΠ·Π±Π΅Ρ€Π° систСма, ΠΏΡ€ΠΈ която Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈΡ‡Π½Π°Ρ‚Π° слоТност ΠΈ броят Π½Π° Π²ΡŠΠ½ΡˆΠ½ΠΈΡ‚Π΅ повиквания са ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ.

Въй ΠΊΠ°Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Π»ΠΈΠ³Π΅Π½Ρ‚Π½ΠΈΡ‚Π΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ отговарят Π½Π° Ρ‚Π΅Π·ΠΈ изисквания ΠΏΠΎ Π½Π°ΠΉ-добрия Π½Π°Ρ‡ΠΈΠ½, ΠΈΠ·Π±ΠΎΡ€ΡŠΡ‚ ΠΏΠ°Π΄Π½Π° Π²ΡŠΡ€Ρ…Ρƒ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ RIDE ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Waves: Ρ‚Π΅ Π½Π΅ са пълни ΠΏΠΎ Π’ΡŽΡ€ΠΈΠ½Π³ ΠΈ максималната ΠΈΠΌ слоТност Π΅ изкуствСно ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°.

Но Π½ΠΈΠ΅ Ρ‰Π΅ Π³ΠΈ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΡ‚ тСхничСската страна.

Π’ допълнСниС към всичко, Π·Π° всякакви Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ, Ρ„ΠΎΡ€ΠΌΠ°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‰Π΅ бъдС особСно Ρ‚ΡŠΡ€ΡΠ΅Π½Π°: ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π΅ нСвъзмоТно Π΄Π° сС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° Π³Ρ€Π΅ΡˆΠΊΠ° Π² Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π°, слСд ΠΊΠ°Ρ‚ΠΎ Π΅ стартирана.
И Ρ†Π΅Π½Π°Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΌΠ½ΠΎΠ³ΠΎ висока, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ доста Π³ΠΎΠ»Π΅ΠΌΠΈ суми срСдства чСсто сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚ Π² ΠΈΠ½Ρ‚Π΅Π»ΠΈΠ³Π΅Π½Ρ‚Π½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ.

ΠœΠΎΡΡ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ VM Π΅ написан Π½Π° PHP ΠΈ Python ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Z3Prover Π½Π° Microsoft Research Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ SMT Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈ.

Π’ основата ΠΌΡƒ Π΅ ΠΌΠΎΡ‰Π½ΠΎ ΠΌΡƒΠ»Ρ‚ΠΈ-Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½ΠΎ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ
Π²ΠΈ позволява Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ уязвимости, Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° изисква ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.
Π”ΠΎΡ€ΠΈ ΠœΠΈΡ‚Ρ€ΠΈΠ», Π΅Π΄Π½Π° ΠΎΡ‚ Π½Π°ΠΉ-ΠΌΠΎΡ‰Π½ΠΈΡ‚Π΅ Ρ€Π°ΠΌΠΊΠΈ Π·Π° Π·Π½Π°Ρ†ΠΈ Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° уязвимости Π½Π° Ethereum, Π΄ΠΎΠ±Π°Π²ΠΈ Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ само ΠΏΡ€Π΅Π΄ΠΈ няколко мСсСца.

Но си струва Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Π΅Ρ‚Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ са ΠΏΠΎ-слоТни ΠΈ ΠΈΠΌΠ°Ρ‚ ΠΏΡŠΠ»Π½ΠΎΡ‚Π° ΠΏΠΎ Π’ΡŽΡ€ΠΈΠ½Π³.

PHP ΠΏΡ€Π΅Π²Π΅ΠΆΠ΄Π° изходния ΠΊΠΎΠ΄ Π½Π° интСлигСнтния Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ RIDE Π² скрипт Π½Π° Python, Π² ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Π΅ прСдставСна ΠΊΠ°Ρ‚ΠΎ Z3 SMT-ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠ° систСма ΠΎΡ‚ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡ Π½Π° Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π° ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ условия Π½Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄:

БъздаванС Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° систСма Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°. Част 1: Character VM Π² PHP ΠΈ Python

Π‘Π΅Π³Π° Ρ‰Π΅ опиша ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π²ΡŠΡ‚Ρ€Π΅, ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

Но ΠΏΡŠΡ€Π²ΠΎ, няколко Π΄ΡƒΠΌΠΈ Π·Π° Π΅Π·ΠΈΠΊΠ° Π½Π° смарт Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ RIDE.

Π’ΠΎΠ²Π° Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΈ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° ΠΈΠ·Ρ€Π°Π· Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΌΡŠΡ€Π·Π΅Π»ΠΈΠ² ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½.
RIDE Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½ΠΎ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²Π»ΠΈΡ‡Π° ΠΈ записва информация ΠΎΡ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с ΠΏΠΎΡ€Ρ‚Ρ„Π΅ΠΉΠ»Π° Π½Π° потрСбитСля.

Π”ΠΎΠ³ΠΎΠ²ΠΎΡ€ RIDE ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π΅Π½ към всСки ΠΏΠΎΡ€Ρ‚Ρ„Π΅ΠΉΠ» ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС само TRUE ΠΈΠ»ΠΈ FALSE.

TRUE ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ интСлигСнтният Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ позволява транзакцията, Π° FALSE, Ρ‡Π΅ я забранява.
ΠŸΡ€ΠΎΡΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΡΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Ρ€Π°Π½ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅Ρ‚ΠΎ, Π°ΠΊΠΎ Π±Π°Π»Π°Π½ΡΡŠΡ‚ Π½Π° ΠΏΠΎΡ€Ρ‚Ρ„Π΅ΠΉΠ»Π° Π΅ ΠΏΠΎ-малък ΠΎΡ‚ 100.

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‰Π΅ Π²Π·Π΅ΠΌΠ° ΡΡŠΡ‰ΠΈΡ‚Π΅ Π’ΡŠΠ»ΠΊ, Коза ΠΈ Π—Π΅Π»Π΅, Π½ΠΎ Π²Π΅Ρ‡Π΅ прСдставСни ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Π»ΠΈΠ³Π΅Π½Ρ‚Π΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€.

ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΡ‚ няма Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‚Π΅Π³Π»ΠΈ ΠΏΠ°Ρ€ΠΈ ΠΎΡ‚ ΠΏΠΎΡ€Ρ‚Ρ„Π΅ΠΉΠ»Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Ρ€Π°Π·Π³ΡŠΡ€Π½Π°Ρ‚ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΡŠΡ‚, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ всички Π½Π° Π΄Ρ€ΡƒΠ³Π°Ρ‚Π° страна.

#ИзвлСкаСм ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°
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 ΠΏΡŠΡ€Π²ΠΎ ΠΈΠ·Π²Π»ΠΈΡ‡Π° всички ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΠΎΡ‚ интСлигСнтния Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Π±ΡƒΠ»Π΅Π² ΠΈΠ·Ρ€Π°Π·.

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 Π³ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π° Π² Z3Prover SMT ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎ описаниС Π½Π° Python систСма.
Π”Π°Π½Π½ΠΈΡ‚Π΅ сС ΠΎΠ±Π²ΠΈΠ²Π°Ρ‚ Π² Ρ†ΠΈΠΊΡŠΠ», ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Ρ‚ индСкс i, ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π·Π° транзакция индСкс i + 1, Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ с ΠΈΠ·Ρ€Π°Π·ΠΈ Π·Π°Π΄Π°Π²Π°Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ към слСдващото.

Π’ΠΎΠ²Π° Π΅ самото ΡΡŠΡ€Ρ†Π΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, която прСдоставя Ρ‚ΡŠΡ€ΡΠ°Ρ‡ΠΊΠ° с мноТСство Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.

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

Условията сС сортират ΠΈ Π²ΠΌΡŠΠΊΠ²Π°Ρ‚ Π² шаблон Π½Π° скрипт, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π΄Π° опишС SMT систСмата Π² python.

ΠŸΡ€Π°Π·Π΅Π½ шаблон


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


Π—Π° послСдното ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° цялата Π²Π΅Ρ€ΠΈΠ³Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ са Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π² Ρ€Π°Π·Π΄Π΅Π»Π° Π·Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π·Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅.

Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Z3Prover Ρ‰Π΅ Ρ‚ΡŠΡ€ΡΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ²Π° Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка Ρ‰Π΅ Π²ΠΈ позволят Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ срСдства ΠΎΡ‚ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π°.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ напълно Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ SMT ΠΌΠΎΠ΄Π΅Π» Π½Π° нашия Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€.
Π’ΠΈΠΆΠ΄Π°Ρ‚Π΅, Ρ‡Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° ΠΎΡ‚ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΌΠΈ статия, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΡΡ‚Π°Π²ΠΈΡ… Π½Π° Ρ€ΡŠΠΊΠ°.

Π—Π°Π²ΡŠΡ€ΡˆΠ΅Π½ шаблон


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


Π‘Π»Π΅Π΄ стартиранСто Z3Prover Ρ€Π΅ΡˆΠ°Π²Π° интСлигСнтния Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ ΠΈ Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Π²Π΅Ρ€ΠΈΠ³Π° ΠΎΡ‚ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° Ρ‚Π΅Π³Π»ΠΈΠΌ срСдства:

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

Π’ допълнСниС към Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Π° Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° СкспСримСнтиратС със свои собствСни Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ ΠΈΠ»ΠΈ Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚Π΅ Ρ‚ΠΎΠ·ΠΈ прост ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ сС Ρ€Π΅ΡˆΠ°Π²Π° Π² 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

}

Въй ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡŠΡ€Π²Π°Ρ‚Π° вСрсия, ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π³Ρ€Π΅ΡˆΠΊΠΈ.
Π’ слСдващитС статии ΠΏΠ»Π°Π½ΠΈΡ€Π°ΠΌ Π΄Π° покрия ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎΡ‚ΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ΠΈ ΠΈΠ½Ρ‚Π΅Π»ΠΈΠ³Π΅Π½Ρ‚Π½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈ с нСя, Π° Π½Π΅ просто Π΄Π° Π³ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚Π΅.

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина Π·Π° Π·Π½Π°Ρ†ΠΈ Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° Π½Π° http://2.59.42.98/hyperbox/
Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ подрСдя изходния ΠΊΠΎΠ΄ Π½Π° символа VM ΠΈ добавям ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Ρ‚Π°ΠΌ, смятам Π΄Π° Π³ΠΎ пусна Π² github със свободСн Π΄ΠΎΡΡ‚ΡŠΠΏ.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€