pythonインテリジェント契約プログラミング--インテリジェント契約のhelloworld

3267 ワード

この章では、簡単なhello、worldの例からpythonスマート契約を書く方法を紹介します.
各スマート契約は、コードとABIの2つの部分から構成されています.コードはpythonコードであってもよいし、C/C++コードであってもよいし、もちろん他の任意のサポートコードであってもよい.コードは最終的にbytecodeにコンパイルされて実行され、C/C++コードの場合は事前にコンパイルによってwastファイルが生成されます.pythonコードはpyeos内部でコンパイルされており、事前にコンパイルする必要はありません.もちろん、後で事前にコンパイルされたpythonコードがサポートされる可能性があります.ABIはApplication Binary Interfaceの略であり、スマート契約の構造を定義するために使用され、ユーザーはtsを送信することによってスマート契約と付き合うことができる.
次はhelloworldスマート契約のコードです.helloというディレクトリから取得できます.
hello.py
import eoslib

def init():
    print('hello,world')

def sayHello():
        print('read message:', eoslib.read_message())

def apply(name, type):
    if type == eoslib.N('sayhello'):
        sayHello()

簡単に説明すると、このpythonコードには2つの事前定義された関数、initとapplyがあります.
  • init関数は、スマート契約のリリース時にのみ呼び出されます.この関数では、tokenの合計数を設定するなど、スマート契約の初期化作業を行うことができます.ここではhello,worldを簡単に印刷して、コードが呼び出されたことを示します.
  • applyは、スマート契約コードを呼び出すエントリであり、両方のパラメータは64ビットの符号なし整数であり、スマート契約を呼び出すアカウントの名前と呼び出すタイプ名を表すためにそれぞれ使用される.64ビットの符号なし整数は、13文字以下の文字列から変換され、文字は以下に示す文字の範囲内に限定される.
  • .12345abcdefghijklmnopqrstuvwxyz
    

    つまり、26文字の小文字しか書けず、「12345」と「.」を付けます.全部で32文字です.
    eoslib.N関数は、このような文字列を符号なし64ビット整数に変換することができる
    スマート契約のABIファイルを見てみましょう.
    hello.abi
    
    {
      "actions": [{
          "action": "sayhello",
          "type": "bytes"
        }
      ]
    }
    

    このABIファイルはとても簡単で、本当のABIファイルはこれよりずっと複雑です.参考hello.pyのコードでこのabiファイルがよく理解できます.「action」:「sayhello」は、トリガーするアクション名がsayhelloであることを示し、pythonコードではhelloに対応する関数を表す.pyにはこの動作を判断してsayHello関数を呼び出します.
    def apply(name, type):
        if type == eoslib.N('sayhello'):
            ...
    

    この動作のパラメータはbytesタイプで、パラメータはスマート契約でeoslibを通過する.read_メッセージで読み取り、
    次に、このスマート契約をeosのブロックチェーンにパブリッシュし、スマート契約を呼び出す方法を見てみましょう.ここでは、pythonスマート契約に従ってデフォルトでプログラミングされています.pythonでEos APIを呼び出す手順で財布が作成され、ロックが解除され、秘密鍵が財布にインポートされました.
    まずhelloという名前のスマート契約アカウントを作成します.
    key1 = 'EOS61MgZLN7Frbc2J7giU7JdYjy2TqnfWFjZuLXvpHJoKzWAj7Nst'
    key2 = 'EOS5JuNfuZPATy8oPz9KMZV2asKf9m8fb2bSzftvhW55FKQFakzFL'
    r = eosapi.create_account('inita', 'hello', key1, key2)
    

    eosapiを呼び出すset_contract関数はコードをブロックチェーンにパブリッシュし、set_contractは、コードファイルとabiファイルを指定します.ファイルパスはbuild/programsディレクトリに対して使用されます.
    r = eosapi.set_contract('hello','../../programs/pyeos/contracts/hello/hello.py','../../programs/pyeos/contracts/hello/hello.abi', 1)
    

    最後に、スマート契約を呼び出す方法を見てみましょう.
    r = eosapi.push_message('hello','sayhello','hello,world',['hello'],{},rawargs=True)
    

    push_Messageの6つのパラメータは、次のとおりです.
  • アカウント名
  • 呼び出すaction
  • actionのパラメータ
  • scopeは、コードが操作を許可するデータ範囲を指定するために表面的な意味を範囲とする.後の文章ではその役割を詳しく説明します.
  • で使用する権限は、指定されておらず、最もよく使用されるのはactive権限です.
  • パラメータのタイプを指定します.デフォルトはabiファイルで指定したタイプを表すdictタイプです.下位コードでは、このdictタイプに基づいてabiファイルで指定された構造によってdictの値をバイナリデータに変換します.ここでrawargs=Trueは元のデータを表し、変換しません.

  • この行のコードを実行すると、次の印刷出力が表示されます.
    read message: b'hello,world'
    

    これで本章は終わります.次の章では、スマート契約で使用するいくつかの重要な関数について説明します.