2020/09/14

[ADA]cardano-serialization-lib from Python その2

cardanorustpython

概要

ADAの決済やdepositのシステムを構築するのに、HDWalletを自作する必要が出てきたので、対応しました。

前回の続きです。

以下を対応しました。

  • 生成したaddressにあるUTXOを使って、Transactionを作成して署名する関数を作成
  • setup.pyでビルド&インストールできるようだったので、組み込みました

実装

以下のPRで対応しました。

setup.pyの部分

ビルドするために、事前に setuptools_rust をインストールしておきます。

% pip install setuptools_rust

setup.py

from setuptools import setup
from setuptools_rust import Binding, RustExtension

setup(
    name='cardano_serialization_lib',
    version='0.1',
    rust_extensions=[RustExtension('cardano_serialization_lib', 'rust/Cargo.toml', binding=Binding.PyO3)],
    zip_safe=False
)

これで、以下を実行すると、 cardano_serialization_lib が自動的にインストールされます。

% python setup.py install
% pip list
Package                   Version
------------------------- -------
cardano-serialization-lib 0.1    

実行

インストールに成功すると、 cardano_serialization_lib をimportすることができるようになります。

あとは、自作した関数(generate_transaction_from_bip32_enterprise_address)を使って、Transactionを作成して、hexな文字列として取得することができます。

import cardano_serialization_lib

# get bip32 enterprise address string in bech32 format.
phrase = "art forum devote street sure rather head chuckle guard poverty release quote oak craft enemy"
password = ""
network = 0
account = 0
chains = 0
index = 0
address = cardano_serialization_lib.generate_bip32_enterprise_address(phrase, password, network, account, chains, index)

# get raw signed transaction bytes
utxo_list = [
    (
        bytes.fromhex("64887f4d5a17571af19c0a73495c17d5dd2627951e50e39ecd7e674621f42d2e"),  # transaction_hash bytes
        0,                                                                                  # transaction_index
        3000000,                                                                            # value
        "addr_test1vpu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5eg57c2qv",                  # address
        phrase,                                                                             # bip32_phrase
        password,                                                                           # bip32_password
        account,                                                                            # bip32_account
        chains,                                                                             # bip32_chains
        index                                                                               # bip32_index
    )
]
to_address = "addr_test1vq0a2lgc2e0r597dr983jrf5ns4hxz027u8n7wlcsjcw4ks96yjys"
send_amount = 1000000
ttl = 410000
change_address = "addr_test1vrq9aq9aeun8ull8ha9gv7h72jn95ds9kv42aqcw6plcu8qkyz99l"
tx_str = cardano_serialization_lib.generate_transaction_from_bip32_enterprise_address(
    network,
    utxo_list,
    to_address,
    send_amount,
    ttl,
    change_address,
)
print(tx_str)

実行結果

83a4008182582064887f4d5a17571af19c0a73495c17d5dd2627951e50e39ecd7e674621f42d2e00018282581d601fd57d18565e3a17cd194f190d349c2b7309eaf70f3f3bf884b0eada1a000f424082581d60c05e80bdcf267e7fe7bf4a867afe54a65a3605b32aae830ed07f8e1c1a001cadca021a0001d6b6031a00064190a10081825820489ef28ea97f719ee7768645fc74b811c271e5d7ef06c2310854db30158e945d584070b622f8b0c2c18976e2d36f52ef1c50627cadf40a3cf324245a639058798a9e1927f0f60955c85ba4de41d80e5f295e34a23ae5c96392ae0e5720f6d569910cf6

以上です。