9
7

More than 1 year has passed since last update.

Symbolの新SDKからSSS(Safely Sign Symbol) Extensionを利用してみる

Posted at

SSSは現在old-sdk対応ですが、新sdkでも使用することができます。
今回は新sdkからSSSを利用する方法について説明します。

symbol-sdk(v3)の埋め込み

ブラウザコンソールを使用して表示中ページにsymbol-sdk-v3を埋め込みます。

(script = document.createElement('script')).src = 'https://xembook.github.io/symbol-browserify/symbol-sdk-3.0.0.js';
document.getElementsByTagName('head')[0].appendChild(script);
環境定義

トランザクション送信に必要な環境の定義、情報を取得します。

node = window.origin;

sdk = require("/node_modules/symbol-sdk");
Buffer = require("/node_modules/buffer").Buffer;

res = await fetch(node + "/network/properties");
json = await res.json();
generationHash = json.network.generationHashSeed;
networkId = json.network.identifier;
currencyMosaicId =  json.chain.currencyMosaicId.split("'").join('').slice(2);
epochAdjustment = Number(json.network.epochAdjustment.replace("s",""));

function createDeadline(secs = 7200) {
	const value = ((Math.trunc(Date.now() / 1000) + secs) - epochAdjustment) * 1000
	return BigInt(value);
}

function setMaxFee(tx,multiplier){
    return new sdk.symbol.Amount(BigInt(tx.size * multiplier))
}

facade = new sdk.facade.SymbolFacade(networkId);
privateKey = new sdk.CryptoTypes.PrivateKey("896E43895B908AF5847ECCB2645543751D94BD87E71058B003417FED5123****")
keypair = new sdk.facade.SymbolFacade.KeyPair(privateKey);

トランザクション作成

トランザクションを作成してペイロードを出力します。

tx = facade.transactionFactory.create({
	type: 'transfer_transaction',
	signerPublicKey: keypair.publicKey.toString(),
	deadline:createDeadline(),
	recipientAddress: 'TD4WXUXYAPPB5Y42VT6FHISG6T32I2IBUXIKKPQ',
	message:[0,...(new TextEncoder('utf-8')).encode('GoodLuck!')],
	mosaics: [
		{ mosaicId: 0x3A8416DB2D53B6C8n, amount: 1000000n }
	]
})
tx.fee = setMaxFee(tx,100);
payload = Buffer.from(tx.serialize()).toString("hex");
SSSへのトランザクションセットと署名要求

ペイロードを利用してトランザクションをセットします。

window.SSS.setTransactionByPayload(payload);
signedTx = await window.SSS.requestSign();
ネットワークへの配置(PUT)

SSSから受け取ったオブジェクトからpayloadを取り出し、
fetchを利用して、ブロックチェーンへトランザクションを配置します。

signedPayload = signedTx.payload;
jsonPayload = `{"payload": "${signedPayload}"}`
response = await fetch(`${node}/transactions`, {
	method: 'put',
	body: jsonPayload  ,
	headers: {'Content-Type': 'application/json'}
});
await response.text();
確認

ネットワークに配置したトランザクションを確認してみましょう。

//承認状態の確認
res = await fetch(`${node}/transactionStatus/${signedTx.hash}`);
console.log(await res.json());

//承認済みトランザクションの確認
res = await fetch(`${node}/transactions/confirmed/${signedTx.hash}`);
console.log(await res.json());

//エクスプローラーで確認
console.log("https://testnet.symbol.fyi/transactions/" + signedTx.hash);
9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7