はじめに
Flutterでのsymbol-sdkのあれこれです。
実装していて気づいたことをメモしていきます。
symbol-sdk(Dart)
publicKeyからアドレスを取得する
facadeを通して取得
import 'package:symbol_sdk/index.dart';
import 'package:symbol_sdk/symbol/index.dart';
import 'package:symbol_sdk/CryptoTypes.dart' as ct;
final keyPair = KeyPair(ct.PrivateKey(privateKey));
final facade = SymbolFacade(networkType);
final address = facade.network.publicKeyToAddress(keyPair.publicKey);
// addressToStringを使うにはpackage:symbol_sdk/index.dartのインポートが必要
final _address = addressToString(address);
print(_address);
以下のように公開鍵を渡すでもOK
final publicKey = ct.PublicKey('863C13B856A8A3012C8DD63C1F151A2F3D7Axxxxxx');
final testaddress = facade.network.publicKeyToAddress(publicKey);
final _address = addressToString(address);
print(_address);
受け取り用のQRを生成する
こんな感じのQRコード(QRコードの中身)ができる。
実際にSymbolのモバイルウォレットで読み取ることが可能。
(読み込んでも勝手に送信などしないので安心してください)
実装
import 'package:symbol_sdk/index.dart';
import 'package:symbol_sdk/symbol/index.dart';
import 'package:symbol_sdk/CryptoTypes.dart' as ct;
var tx = TransferTransactionV1(
network: networkType,
deadline: Timestamp(facade.network.fromDatetime(DateTime.now().toUtc()).addHours(2).timestamp),
recipientAddress: UnresolvedAddress(_address),
mosaics: [UnresolvedMosaic(mosaicId: UnresolvedMosaicId(0x72C0212E67A08BCE), amount: Amount(1000000))],
message: MessageEncorder.toPlainMessage(decodedData['data']['message']),
);
Uint8List bytes = tx.serialize();
// String payload = bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
String payload = bytesToHex(bytes);
final qrCodeData = {
"v": 3,
"type": 3,
"network_id": 152,
"chain_id": "57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6",
"data": {
"payload": payload
}
};
※モザイク数量を計算する際にはモザイクの情報を取得して過分性を考慮する必要がある。
処理の流れ
TransferTransactionを作成する際にsignerPublicKeyを入れずに作成。
その後、serialize
メソッドでUint8List
を受け取る。
byte.toRadixString(16)
でUint8List
を16進数の文字列に変換。(もっと他に良いやり方があるかも)
symbol-qr-libraryのGenerate QRCode for a Transaction RequestのTransactionQRで生成される形式に成形。
あとは好みのQRコード生成ライブラリを使ってqrCodeDataをよしなに描画する。