logo

Fireblocks触ってみた

〜1/3の純情なキーシェア〜
profile photo
TaniguchiAkira

Fireblocksってなに?

一言で言うとMPCウォレットを提供するSaaS。
主にtoBを想定しているであろうシステムで、顧客の資産を扱ったりするタイプの事業で猛威を振るうと思われる。
開発者向けのドキュメントや管理画面、API、ライブラリがきっちり提供されているところが、かなり好感が持てる(主観)。
こういうサービスは開発者に好かれるため、広く普及していくと思う(主観)。
ユーザが利用するゲームなどの軽い感じのフロント運用はWeb3Auth、バックエンドや金融システムなどの重い感じの運用はFireblocksというように使い分ければいいんじゃないかな(主観)。

そもそもMPCウォレットってなに?

  • 単一の秘密鍵が存在しない
    • 秘密鍵が単一のデバイスに存在することがない。
      • 秘密鍵がキーシェアと呼ばれる形に分割される。
      • それぞれのキーシェアで署名をし、それらを結合してブロックチェーンに有効な署名データになるイメージ。
      • 仮にキーシェアのうちの1つが流出しても、ウォレットの財産が盗難されることはない。
    • 故に秘密鍵流出のリスクが低い
    • ちょっと前にリリースされたBinanceのウォレットもMPCウォレット
      • Binanceウォレットの場合は、キーシェアをバイナンスとデバイスとGoogle Driveなどのストレージサービスに分離している
  • 特定のチェーンに依存しない
    • ほとんどのブロックチェーンが採用している署名アルゴリズムを採用しているため、どんなチェーンでも採用できる。
      AAマルチシグと違い、専用のコントラクトを書いたり、ネイティブの仕様に強く依存する必要もなく、ガス代も安くすむ。
      その証拠にFireblocksのサポートチェーンは幅広く、EVMだけではなくSolanaやそもそもコントラクトが存在しないNEMまでにも及ぶ。

とりあえず動かしてみた

Quick Startを参考に動作させてみた。

ユーザの作成

まずは管理画面にアカウントを作成し、ログインしてからユーザを作成する必要がある。
わざわざアプリ使って6桁のコードを入力させるところが、セキュリティ重視という雰囲気がする
わざわざアプリ使って6桁のコードを入力させるところが、セキュリティ重視という雰囲気がする
ファイアー繋がりで、ユーザ名は「にらみつける」にしてみた
ファイアー繋がりで、ユーザ名は「にらみつける」にしてみた
ユーザを作成すると、そのユーザに紐づく「fireblocks_secret.key」なるファイルをダウンロードすることができる。
fireblocks_secret.keyの中身はLinuxのsshの設定で作成されるやつ(id_rsa)っぽい感じやった。おそらくこれがMPC key shareのうちの一つなのだろう。
これを元にサンプルコードを動作させ、ふいんき(なぜか変換できない)を掴んでいこうと思う。

Fireblocksをプログラムから操作してみる

取り急ぎ、TypeScriptで動かしてみる。
まずはサンプルソースを触ってみて、気づいたことを羅列する。
  • 事前準備として、「fireblocks-sdk」なるものを、npmやyarnやpnpmを使って事前に実行環境にインストールする必要がある。
    • 以前記載した、Ledgerのクラッキングと同様に、fireblocks-sdkのリリース権限を乗っ取れば財産を強制転送できるのでは、と一瞬考えたが、おそらくMPCの残りのキーシェアはサーバサイドに存在し、その署名も雲の向こう側でやっているため、多分大丈夫なんだろうなと思う。
    • めちゃくちゃ話は変わるが、パッケージ管理はもうnpmでいい気がする。(主観)
      • 昔と比べて随分速くなったし。。。
では本題に。
下記は管理しているすべてのVaultの情報を取得するサンプルコード。
Vaultとはデジタル資産の保管庫のようなもので、sandbox環境ではtest用のダミーのトークンもこの中に入っている。
ちなみにapiKeyは管理画面から取得する必要がある。
javascript
import {readFileSync} from 'fs'; import {inspect} from 'util'; import { FireblocksSDK } from 'fireblocks-sdk'; import { resolve } from 'path'; // ユーザ作成タイミングで取得した秘密鍵ファイルを読み込む const apiSecret = readFileSync(resolve("/path/to/fireblocks_secret.key"), "utf8"); const apiKey = "{見せられないよ!}" // sandbox用のURLを設定 const baseUrl = "https://sandbox-api.fireblocks.io"; const fireblocks = new FireblocksSDK(apiSecret, apiKey, baseUrl); async function main() { const vaultAccounts = await fireblocks.getVaultAccountsWithPageInfo({}); console.log(inspect(vaultAccounts, false, null, true)); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error) process.exit(1) })
このプログラムを実行した、結果はこちら。
「Default」という名前のVaultの中に、「BTC_TEST」と「ETH_TEST3」という名前をもつアセットが存在することがわかる。
javascript
{ accounts: [ { id: '0', name: 'Default', hiddenOnUI: false, autoFuel: false, assets: [ { id: 'BTC_TEST', total: '0', balance: '0', lockedAmount: '0', available: '0', pending: '0', frozen: '0', staked: '0', blockHeight: '-1' }, { id: 'ETH_TEST3', total: '0.01', balance: '0.01', lockedAmount: '0', available: '0.01', pending: '0', frozen: '0', staked: '0', blockHeight: '10271862', blockHash: '0x7e8086f30532b4fa9730719c0840a4346a073c015c58ac6861b0c0639fbd0817' } ] } ], paging: {} }
次にウォレットを作成してみた
javascript
import {readFileSync} from 'fs'; import {inspect} from 'util'; import { FireblocksSDK } from 'fireblocks-sdk'; import { resolve } from 'path'; const apiSecret = readFileSync(resolve("/path/to/fireblocks_secret.key"), "utf8"); const apiKey = "見せれるわけがないよ" // sandbox用のURLを設定 const baseUrl = "https://sandbox-api.fireblocks.io"; const fireblocks = new FireblocksSDK(apiSecret, apiKey, baseUrl); async function main() { // vaultの情報を取得 const vaultAccounts = await fireblocks.getVaultAccountsWithPageInfo({}); // アセットのidを取得 // btcやethやsolなど、アセットによってウォレットの構造が変わるため?な気がする。 const assetId = vaultAccounts.accounts[0].assets![1].id; // ETH_TEST3 console.log("Asset ID:", assetId); // 「QuickStart_Vault」という新規Vaultを作成する const vaultCreation = await fireblocks.createVaultAccount("QuickStart_Vault"); console.log(inspect(vaultCreation, false, null, true)); const vault = { vaultName: vaultCreation.name, vaultID: vaultCreation.id }; // 新規Vaultに紐づくウォレットを作成 const vaultWallet = await fireblocks.createVaultAsset(vault.vaultID, assetId); console.log("Vault Account Details:", vault); console.log("Wallet Asset Details for ", vault.vaultName,":", vaultWallet); console.log("Wallet address", vaultWallet.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error) process.exit(1) })
上記コードで出力される結果は下記。
javascript
Asset ID: ETH_TEST3 { id: '1', name: 'QuickStart_Vault', hiddenOnUI: false, assets: [], autoFuel: false } Vault Account Details: { vaultName: 'QuickStart_Vault', vaultID: '1' } Wallet Asset Details for QuickStart_Vault : { id: '1', address: '0xe2Fe3244603Cc91D14fE14ad067070fC685D005E', legacyAddress: '', tag: '' } Wallet address 0xe2Fe3244603Cc91D14fE14ad067070fC685D005E
このウォレットを使って資産を管理したり、ステーキングのトランザクションを発生させたりする想定なのだろう、多分。
敗北を知りたい。

所感

できれば個人資産管理にも利用してみたい。
Ledgerなどのハードウェアウォレットも悪くはないのだが、
  • ハードウェア自体の定期的なアップデートが必要
  • ハードウェア自体が故障する
  • ニーモニックの保管も手間がかかる
などなどの理由により、はっきり言ってめんどくさい。ハードウェアウォレット自体にパスワードはかかっているものの、保管されているニーモニックが悪意ある人に盗難されたり、災害で紛失したりするリスクは0ではない。鉄板を使っても限界はある。
(話はズレるが、今のCryptosteelってMIBの記憶消去装置みたいな形なのね、やだ、、かっこいい、、、、、)
Fireblocks使えば、キーシェアのうちの一つをGoogle Driveにアップしとけば、それでいいんじゃねーのと思ったり思わなかったり。
だがしかし、一番安い契約でも結構なお値段がするので、やはりこのプロダクトは企業向けの域を出ない。
そうなってくると、同じMPCウォレットを利用できるバイナンスウォレットとかいいのかなと思いきや、対応チェーンがBSCとEthereumだけなので、カバー範囲が狭い。
Fireblocks並みの対象チェーン範囲を持ち、かつ個人でも使いやすい値段で使えるsaas(ウォレットアプリ)、欲しい。

最後に

このブロクを書いている自分はNFTゲームプラットフォーム・ PlayMiningを運営する
Digital Entertainment Asset Pte.Ltdで働いています。
コンテンツの内容、採用など、興味ある人がいたら問い合わせください。

参考リンク

Supported blockchain networks
Overview The following is a list of blockchain networks supported by Fireblocks. To request support for additional blockchain networks, contact your Fireblocks Account Manager (customer sign-in req...
Supported blockchain networks
Developer Sandbox Quickstart Guide
OverviewThe Fireblocks Developer Sandbox is a unique workspace built specifically for developers to get started using Fireblocks APIs and SDKs quickly.You can find a complete list of supported blockchain testnets on this Help Center article.In the Developer Sandbox, basic default settings are pre-se...
ハードウェアウォレット&コールドウォレット - 暗号資産のセキュリティ | Ledger
Bitcoin、Ethereum、XRP、Moneroなどの暗号資産を安全に保管します。 暗号資産の安全を確保して、安心をお届け。
ハードウェアウォレット&コールドウォレット - 暗号資産のセキュリティ | Ledger
バイナンスWeb3ウォレットとは | Binance Academy
バイナンスWeb3ウォレットは、利便性、安全性、実用性を兼ね備え、資産管理を簡単にし、分散型金融とDAppsの世界にアクセスできる優れたツールです。
バイナンスWeb3ウォレットとは | Binance Academy
最強のコールドウォレットと名高いCryptosteel(クリプトスティール)とは?
みなさん仮想通貨の保管や管理はどのようにしていますか?ソフトウェアウォレットや取引所に保管している人、ハードウェアウォレットを使っている人など様々だと思いますが、今回は最強のコールドウォレットと名高いアイテムをご紹介したいと思います。 その名も、Cryptosteel(クリプトスティール)です。
最強のコールドウォレットと名高いCryptosteel(クリプトスティール)とは?
Cryptosteel Capsule Solo
24単語のリカバリーフレーズを保護する強固なスチール製カプセルです。過酷な環境にも耐えられるように設計されています。 お客様のリカバリーフレーズは、お客様の暗号資産の唯一のバックアップです。Cryptosteel Capsuleで、安全に保管することができます。 バックアップの保護におけるセキュリティをさらに強化して、究極のレジリエンス(対応力)を実感してください。
Cryptosteel Capsule Solo
シネマーズ・ストア / メン・イン・ブラック2/ ニューラライザー プロップレプリカ(リミテッドエディション)【予約限定:受付終了】
通常価格:¥ 148,500 税込
Account Abstraction(ERC4337)を、具体的な処理を追ってしっかりと理解してみましょう。
こんにちは、CryptoGamesのユウキです。
Account Abstraction(ERC4337)を、具体的な処理を追ってしっかりと理解してみましょう。
マルチシグとは?マルチシグの仕組みやメリットやデメリットを解説 | Coincheck
マルチシグとは、暗号資産(仮想通貨)の送金で大切な役割を果たすセキュリティシステムです。この記事ではマルチシグの意味や具体的な仕組み、メリットやデメリットについて解説します。
マルチシグとは?マルチシグの仕組みやメリットやデメリットを解説 | Coincheck
Related posts
post image
〜まさかりに身を委ねてみる〜
post image
Solidity
Optimism
Arbitrum
L2
Wormhole
Layer0
オレオレインターフェースからERC7802へ
ユニバーサル規格は大事
post image
Layer2
zk-Rollup
INTMAX
Mining
INTMAXのマイニングやってみた
人の夢と書いてトークンと読む
Powered by Notaku