【Python】BitsvとPolyglotでBitcoinSV(BSV)のブロックチェーンに画像データをアップロード

この記事は約8分で読めます。

 

前回はMoney buttonのjavascriptライブラリを使用してBitcoinSV(BSV)のブロックチェーンにアクセスし、送信や文字データの送信を行う方法について解説しました。

 

 

 

今回はPython用のBSVライブラリを使ってbitcoinSV(BSV)のブロックチェーンにアクセスし、op_returnでテキストや画像をアップロードしたいと思います。

 

 

ライブラリのインストール

 

今回使用するライブラリは「BITSV」とその上位互換の「Polyglot」の2つです。他にも一応「base58」とかも必要ですがこれらをインストールすると勝手にインストールされます。(されない場合は各自でインストールしてください)

 

 

# 必要なライブラリをインストールする
pip install bitsv
pip install polyglot-bitcoin

 

公式ドキュメント:

https://pypi.org/project/bitsv/

https://pypi.org/project/polyglot-bitcoin/

 

 

コマンドラインで必要なライブラリをインストールできたらPython上で呼び出します。

 

 

# ライブラリを読み込む
import bitsv
import polyglot

 

 

秘密鍵(ウォレット)を用意する

 

前回も解説しましたが、ブロックチェーンにアクセスするためには、まず自分のウォレットアドレス(秘密鍵)が必要になります。

 

既にBSVを保有している人はスマホアプリなんかのウォレットのパスフレーズから秘密鍵を復元するという手もありますが、セキュリティ面を考えると新しくウォレットを作成して、そこに少額のBSVを送金して今回の作業び使用するというのが無難かと思われます。秘密鍵の生成はMoneybuttonのライブラリを使用することで簡単にできます。

 

秘密鍵の生成の方法などは、関連記事:BitcoinSV(BSV)のブロックチェーンにop_returnで任意のデータを刻み込む の方で解説しているので、そちらを参考にしていただけると幸いです。

 

 

ウォレットの残高を確認する

 

秘密鍵が用意できたらそれを.keyの引数にセットしてクラスとします。こうすることで秘密鍵が保有しているBitcoinSV(BSV)の残高を確認や様々なデータのトランザクションの送信が可能になります。残高の確認はmy_key.get_balance()で行えます。

 

 

# 自分の秘密鍵をセット
key = 'WIF方式の秘密鍵(16進数で表示された自分の秘密鍵)'
my_key = bitsv.Key(key)

# ウォレットの残高を確認する
bal = my_key.get_balance()
print(bal)

 

 

BitSVから他のアドレスにBSVを送金する

 

# 送金額とあて先を指定する
outputs = [
    # ドル単位で送る場合
    ('1PdvVPTzXmo4cSs68HctLUxAdW917UZtC8', 0.1, 'usd'),
    # bsv単位で送る場合
    ('1PdvVPTzXmo4cSs68HctLUxAdW917UZtC8', 0.0001, 'bsv'),
    ] 

# outputで指定したアドレスと金額を送信する
res = my_key.send(outputs)

# トランザクションIDを確認する
print(res)


 

ここでサンプルで指定しているBSVのアドレスはBITSVの開発者の寄付用アドレスです。このライブラリが便利だなと思った方は開発者のAustEconさんにBSVを寄付しましょう。resには戻り値として、トランザクションIDがjsonの形で格納されています。

 

 

polyglotで画像データをブロックチェーンにアップロード

 

次は、Polyglotで画像データをブロックチェーンにアップロードしていきます。BSVは1byteあたり1satoshiでデータをアップロードすることができ、polyglotでは100kb以下のデータであれば、簡単にアップロードすることが可能です。100kb以下の画像というとアイコンくらいになります。

 

 

# ライブラリの読み込み&秘密鍵のセット
import polyglot
uploader = polyglot.Upload('your private key goes here in WIF format')

 

 

今回はこの画像をアップロードします。この画像のデータサイズは6kbです。

 

 

 

※ブロックチェーンは一度データをアップロードすると削除することは基本的に不可能なので、アダルトな画像などをアップロードすると最悪逮捕される危険性があるので、アップロードする画像は慎重に吟味してください

 

 

# アップロードしたい画像のローカルパス
img_path = "C:\\Users\\user_name\\Downloads\\xxxxx.jpg"

# ブロックチェーンに画像をアップロードする
res = uploader.upload_b(img_path, media_type=None,
encoding=None, file_name=None)

# トランザクションIDを表示する
print(res)

 

ローカルPCの画像のパスはファイル名に日本語が混じっていると文字コードエラーになるので、注意してください。

 

resに格納されているのはトランザクションIDでjson方式で返されます。今回の実行した結果のresの戻り値は↓のようになりました。

 

{‘data’: {‘txid’: ‘c3e42519a7a76e81cdf26470decf23

56c21f4e1b2bfacfcc1e409e6ec88cf714′}}

 

 

またこの関数は内部でunwritterの画像アップロードプロトコルであるb://を使用しているため、彼の作ったbitstagramhttps://bitstagram.bitdb.network/)で確認することができます。

 

 

 

前回は一々ブロックチェーンエクスプローラーのサイトにアクセスしてop_returnのアドレスとか中身とか確認していたわけですが、よくよくサイトを見たら、トランザクションの中身だけ取得できるAPIが用意されていたので、APIを使用してPython上でそのままトランザクションの中身を確認します。

 

 

# blockchair.com/のAPIを使ってトランザクションの内容を確認する
import requests
import json


# tx_hash ='c3e42519a7a76e81cdf26470decf2356c21f4e1b2bfacfcc1e409e6ec88cf714'
tx_hash = res['data']['txid']

# requestでトランザクション内容を取得
r = requests.get(
    'https://api.blockchair.com/bitcoin-sv/dashboards/transaction/' + tx_hash)
r = json.loads(r.text)

# レスポンスの中から画像のデータだけを取得して変数に格納する
img_binary = r['data'][tx_hash]['outputs'][1]['script_hex']

# プリントで確認
print(img_binary)

 

 

変数rにはトランザクションの内容が全て格納されており、画像などの比較的大きなデータをアップロードすると、バイナリ化した画像データが大量に表示されます。

 

 

終わり

 

以上がBitsvとPolyglotを使用してBitcoinSVのブロックチェーン上に画像データをアップロードする方法です。

 

Polyglotの今後のロードマップでは、unwritter氏のBitcomを土台として、htmlをアップロードしルーティング処理を行うことでwebサイトそのものもアップロードできる予定になっており、この機能ができれば、ブロックチェーンエンジニアでなくとも普通のエンジニアなら誰でも比較的容易にDappsを作成することが可能になるので、BitcoinSVの今後が楽しみです。

 

ですがやはりエンジニアとしてhttpの仕組みくらいは知っておかないといけないように、ブロックチェーンも根本の原理は理解し理解しておかないと良いDappsや画期的なプロダクトは作れないと思うので最近は勉強会に参加したり参考書を読んで基本を勉強しています。

 

FLOC(フロック)ブロックチェーン大学校
 

 

 

コメント

タイトルとURLをコピーしました