[PYTHON] Schreiben Sie den Ethereum-Vertragscode mit Serpent

Was ist Schlange?

Installation (Pyethereum)

python


$ git clone https://github.com/ethereum/pyethereum
Cloning into 'pyethereum'...
remote: Counting objects: 12773, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 12773 (delta 0), reused 0 (delta 0), pack-reused 12761
Receiving objects: 100% (12773/12773), 4.48 MiB | 48.00 KiB/s, done.
Resolving deltas: 100% (9465/9465), done.
Checking connectivity... done.

$ cd pyethereum/

$ git checkout develop
Already on 'develop'
Your branch is up-to-date with 'origin/develop'.

$ pip install -r requirements.txt 
Collecting https://github.com/ethereum/ethash/tarball/master (from -r requirements.txt (line 9))
  Downloading https://github.com/ethereum/ethash/tarball/master
     - 92kB 89kB/s
  :
  :
 Running setup.py install for pyethash ... done
Successfully installed bitcoin-1.1.42 pbkdf2-1.3 pycryptodome-3.4 pyethash-0.1.23 pysha3-0.3 repoze.lru-0.6 rlp-0.4.6 scrypt-0.7.1 secp256k1-0.13.2

$ pythin setup.py install
Installed /private/var/folders/53/svs5z_nd1b98rlwp_nn5ybk80000gn/T/easy_install-chm3e1an/pytest-runner-2.7/.eggs/setuptools_scm-1.11.1-py3.5.egg
zip_safe flag not set; analyzing archive contents...

packages
Finished processing dependencies for ethereum==1.5.2

Installation (Schlange)

python


$ git clone https://github.com/ethereum/serpent.git
Cloning into 'serpent'...
remote: Counting objects: 2053, done.
remote: Total 2053 (delta 0), reused 0 (delta 0), pack-reused 2053
Receiving objects: 100% (2053/2053), 3.38 MiB | 82.00 KiB/s, done.
Resolving deltas: 100% (1327/1327), done.
Checking connectivity... done.

$ cd serpent

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

$ make && sudo make install
c++ -fPIC -Wno-sign-compare   -c -o keccak-tiny.o keccak-tiny.cpp
c++ -fPIC -Wno-sign-compare   -c -o bignum.o bignum.cpp
 :
 :

Installed /Users/abenben/.pyenv/versions/anaconda-2.2.0/lib/python2.7/site-packages/ethereum_serpent-2.0.2-py2.7-macosx-10.6-x86_64.egg
Processing dependencies for ethereum-serpent==2.0.2
Finished processing dependencies for ethereum-serpent==2.0.2

Bestätigung des Probenbetriebs (1)

Versuchen Sie, einige der Proben an den folgenden Orten zu verschieben https://github.com/ethereum/wiki/wiki/Serpent

Weitere Beispiele sind an folgenden Standorten erhältlich https://github.com/ethereum/serpent/tree/master/examples

Bereiten Sie zunächst eine einfache Implementierung der Schlange vor

mul2.se


def double(x):
    return(x * 2)

kompilieren

python


$ serpent compile mul2.se
604380600b600039604e567c010000000000000000000000000000000000000000000000000000000060003504636ffa1caa81141560415760043560405260026040510260605260206060f35b505b6000f3

Kompilieren (hübsch_kompilieren)

python


$ serpent pretty_compile mul2.se
[PUSH1, 67, DUP1, PUSH1, 11, PUSH1, 0, CODECOPY, 
PUSH1, 78, JUMP, PUSH29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, PUSH1, 0, 
CALLDATALOAD, DIV, PUSH4, 111, 250, 28, 170, DUP2, EQ, ISZERO, 
PUSH1, 65, JUMPI, PUSH1, 4, CALLDATALOAD, PUSH1, 64, MSTORE, 
PUSH1, 2, PUSH1, 64, MLOAD, MUL, PUSH1, 96, MSTORE, PUSH1, 32, 
PUSH1, 96, RETURN, JUMPDEST, POP, JUMPDEST, PUSH1, 0, RETURN]

In LLL-Format konvertieren (LISP?)

python


$ serpent compile_to_lll mul2.se
(return 0 
  (lll 
    (with '__funid 
      (div (calldataload 0) 
        26959946667150639794667015087019630673637144422540572481103610249216
      )
      (unless (iszero (eq (get '__funid) 1878662314)) 
        (seq 
          (set 'x (calldataload 4))
          (seq 
            (set '_temp_521 (mul (get 'x) 2))
            (return (ref '_temp_521) 32)
          )
        )
      )
    )
    0
  )
)

Versuchen Sie, das Smart Contract-Beispiel in Python auszuführen


$ ipython
In [1]: from ethereum import tester as t
In [2]: s = t.state()
In [3]: c = s.abi_contract('mul2.se')
In [4]: c.double(42)
Out[4]: 84
In [5]: 

Überprüfen Sie die Funktionsdefinition

python


$ serpent mk_signature mul2.se
extern mul2.se: [double:[int256]:int256]

Bestätigung des Probenbetriebs (Teil 2)

Bereiten Sie eine weitere Probe vor Dies ist eine Implementierung, die Schlüsselwertwerte verwaltet. Services, die Domains wie NameCoin verwalten, werden wahrscheinlich mit intelligenten Verträgen realisiert.

namecoin.se


def register(key, value):
    # Key not yet claimed
    if not self.storage[key]:
        self.storage[key] = value
        return(1)
    else:
        return(0)  # Key already claimed

def ask(key):
    return(self.storage[key])

Versuchen Sie, von Python aus zu laufen


$ ipython
In [1]: from ethereum import tester as t

In [2]: s = t.state()

In [3]: c = s.abi_contract('namecoin.se')

In [4]: c.register(0x67656f726765, 45)
Out[4]: 1

In [5]: c.register(0x67656f726765, 20)
Out[5]: 0

In [6]: c.register(0x6861727279, 65)
Out[6]: 1

In [7]: c.ask(0x6861727279)
Out[7]: 65

Es ist wirklich nur eine Berührung, um eine Chance zu schaffen.

Hier gibt es auch ein Tutorial-Material. Bitte probieren Sie verschiedene Dinge aus. http://mc2-umd.github.io/ethereumlab/docs/serpent_tutorial.pdf

Recommended Posts

Schreiben Sie den Ethereum-Vertragscode mit Serpent
Schreiben Sie testgetriebenen FizzBuzz-Code mit Python doctest.
Schreiben Sie Python-ähnlichen Code
Schreiben Sie Python-ähnlichen Code (Dictionary)
Schreiben Sie FizzBuzz ohne "="
Schreiben Sie die Standardeingabe in den Code
Schreiben Sie Spigot in VS Code