🌻

LINE Blockchain Developers SDKのRuby版を作った

2021/12/04に公開

LINE BlockchainはLINEが提供しているプライベートブロックチェーンである。このチェーンを使ってwebサービスなどを作る際には下記リンクに記載されているAPIを使う事になる。ユーザーのウォレットへのアクセスリクエストやトークンの発行/鋳造など全てこのAPIを使って行えるため、自前のアプリへの統合は特別なblockchainの知識がなくとも簡単に利用できる。
https://docs-blockchain.line.biz/ja/api-guide/

このLINE Blockchainはまだ一般ユーザーには開放されていないベータ版?のような扱いである。現状提供されているAPIライブラリはJavascript,Golang,Kotlinの実装しかない。

ただ個人的にはRubyから扱いたいという機会がまぁまぁある。そこでRuby用SDKのgemを作った。
https://github.com/YuheiNakasaka/lbd_sdk_rb

APIの概要に記載されている全エンドポイント用のメソッドを実装してある。リクエスト時に必要になる署名はライブラリ側で勝手にやってくれるので利用者側はエンドポイントの指定と各種パラメータを指定するだけで良い。

コードは公式実装のJavascript版SDKに寄せた作りになっている。そのせいでメソッド名が冗長になっていたりする。

実際に使い方も書いておく。といっても特に難しいことはなくて、LINE Blockchain Developersコンソールが使えるようになると手に入るAPI_KEYAPI_SECRETと対象のエンドポイントを指定してclientを初期化する。あとは任意のリクエスト用のメソッドを叩くだけ。

require 'lbd_sdk'

client = LbdSdk::Client.new do |config|
  config.endpoint = 'https://test-api.blockchain.line.me'
  config.api_key = 'your_api_key'
  config.api_secret_key = 'your_secret_key'
end

# GET /v1/time
client.time()

# GET /v1/users/{userId}
client.user_detail("<your-user-id>")

# GET /v1/users/{userId}/transactions
client.user_transactions("<your-user-id>", {page: 1, limit: 1})

# POST /v1/item-tokens/{contractId}/non-fungibles
client.create_non_fungible_token("<contract_id>", {
  owner_address: "owner_address",
  owner_secret: "owner_secret",
  name: "SampleToken",
})

# POST /v1/item-tokens/{contractId}/non-fungibles/{tokenType}/mint
client.mint_non_fungible_token("contract_id", "token_type", {
  owner_address: "owner_address",
  owner_secret: "owner_secret",
  name: "SampleToken",
  to_user_id: "yout-user-id"
})

# PUT /v1/item-tokens/{contractId}/non-fungibles/{tokenType}/{tokenIndex}
client.update_non_fungible_token("contract_id", "token_type", "token_index", {
  owner_address: "owner_address",
  owner_secret: "owner_secret",
  name: "SampleToken2",
})

# POST /v1/item-tokens/{contractId}/non-fungibles/{tokenType}/{tokenIndex}/burn
client.burn_non_fungible_token("contract_id", "token_type", "token_index", {
  owner_address: "owner_address",
  owner_secret: "owner_secret",
  from_user_id: "yout-user-id"
})

紹介はここまでなのであとは雑談。

久々(4年ぶり)にRubyでgemを書いた感想としては、ホームのような温かみある書き心地〜という気持ちとそこは実行前にエラーにしてくれ〜みたいなやつが頻発してしてぐにゃぐにゃになった。特にAPIクライアントだとquery_parameterやpayload、あとはresponseの型定義を静的に出来た方が嬉しいケースが多い気がするのでそこは曖昧な実装になってしまったな〜という感想。

全部で78エンドポイント分を1~2日間くらいで実装したので雑になってしまった部分も否めないが、そこらへんは今後誰かもっと出来る人に気合いで直してもらえばいいやととりあえずリリースしている。リクエスト自体は一応全部Cashew(LINE Blockchainのテストネット)内の自前のサービス環境で実行しているので動作はするはず。

そういえば公式SDKのline/line-blockchain-developers-sdk-jsとドキュメントを見比べながら実装している中で発見したバグが1,2個あったので修正PRを出したりした。動作には大きな問題はないがドキュメントに書いてある仕様と挙動がちょっとだけ異なるみたいなやつ。重箱の隅を突くマンになってしまった。

あとこれは未解決なんだけど、GitHub Actionsでrubygemsへreleaseを行いたくてworkflow.ymlを書いたがAPI_KEYをsecretsで設定しても失敗する。rubygemsへのアクセスで蹴られてるから2段階認証の問題かな?と思ってAPI_KEYの権限をUIのみ2段階認証を行う設定にしたりしてみたけどダメだった。色々やってるうちにGitHub ActionsのjobがQUEUEに入ったまま動かなくなってしまったのでやめた。一旦大きなリリースはないと思うからいいんだけどあれ何が悪いのか...。

Discussion