deadlineは実際の時間から数時間後と設定することが多いですが、Symbolのネットワーク時間は少し未来です。
実際の時間とSymbol時間を表示するコード
import symbolSdk from 'symbol-sdk';
const NODE = 'http://finnel.harvestasya.com:3000';
// /node/time を取得
const nodeTimeResponse = await fetch(new URL('/node/time', NODE), {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});
// 実時間取得
const actualTime = new Date();
// /node/time からネットワーク時間算出
const nodeTimeJson = await nodeTimeResponse.json();
const symbolTime = Number(
nodeTimeJson.communicationTimestamps.receiveTimestamp
);
const facade = new symbolSdk.facade.SymbolFacade('mainnet');
const networkDate = facade.network.toDatetime(
new symbolSdk.symbol.NetworkTimestamp(symbolTime)
);
// 表示
console.log(`ActualTime: ${actualTime}`);
console.log(`SymbolTime: ${networkDate}`);
/node/timeとは
/node/time
は、Symbol時間をこういうJsonを返します。sendTimestamp
、receiveTimestamp
が異なる値になっているのは見たことないので、どちらを使用しても良いかと思います。
{
"communicationTimestamps": {
"sendTimestamp": "93214047045",
"receiveTimestamp": "93214047045"
}
}
実行
ActualTime: Wed Feb 28 2024 05:42:46 GMT+0900 (日本標準時)
SymbolTime: Wed Feb 28 2024 05:42:50 GMT+0900 (日本標準時)
Symbolは3~4秒先を見てる。
実際使う場合
使用端末の時間があってるとは限らないので、ネットワーク時間取得してdeadline設定する方が良いかと。
import symbolSdk from 'symbol-sdk';
const NODE = 'http://finnel.harvestasya.com:3000';
// /node/time を取得
const nodeTimeResponse = await fetch(new URL('/node/time', NODE), {
method: 'GET',
headers: { 'Content-Type': 'application/json' },
});
// /node/time からネットワーク時間算出
const nodeTimeJson = await nodeTimeResponse.json();
const symbolTime = Number(
nodeTimeJson.communicationTimestamps.receiveTimestamp
);
// deadline 2時間
const networkTimestamp = new symbolSdk.symbol.NetworkTimestamp(symbolTime);
const deadline = networkTimestamp.addHours(2).timestamp;
// 表示
console.log(`SymbolTime: ${symbolTime}`);
console.log(`DeadLine : ${deadline}`);