11
5

More than 1 year has passed since last update.

Symbolブロックチェーンで不正な署名要求を検知し、注意喚起のメッセージを送る方法

Last updated at Posted at 2022-01-14

現在Symbolブロックチェーン上で、全額振り込みのトランザクションに署名させる詐欺が確認されています。今回はそういった詐欺行為を検知し、注意喚起のメッセージをトランザクションに載せて自動で送信する方法を紹介します。

いつもはBrowser上のJavascriptで紹介していますが、今回は常駐させる必要があるのでNodeJS上で動かします。もちろんブラウザ上で起動させて、イベント期間中だけ入金したアカウントにチケットを配布させるローコードでデプロイレスなスマートコントラクトとして利用するなども可能です。ソースコードについては以下の記事を参考にさせていただきました。


const sym  = require("symbol-sdk");
const nodeURL = 'https://node.xembook.net';

//詐欺アカウント
const scamAddress = sym.Address.createFromRawAddress('NA3H3EXNWIARYBYGIMOQFKWPD2KSV2DFLGCO***');

//リポジトリ関連の設定
const repositoryFactory = new sym.RepositoryFactoryHttp(nodeURL);
const listener = repositoryFactory.createListener();
const accountHttp = repositoryFactory.createAccountRepository();
const transactionHttp = repositoryFactory.createTransactionRepository();
const receiptHttp = repositoryFactory.createReceiptRepository();
const transactionService = new sym.TransactionService(transactionHttp, receiptHttp);

// メイン処理
(async () => {

    //ネットワーク設定値
    const networkType = await repositoryFactory.getNetworkType().toPromise();
    const networkCurrency = (await repositoryFactory.getCurrencies().toPromise()).currency;
    const epochAdjustment = await repositoryFactory.getEpochAdjustment().toPromise();
    const generationHash = await repositoryFactory.getGenerationHash().toPromise();

    //注意喚起アカウント
    const alertAccount =  sym.Account.createFromPrivateKey("***********",networkType);

    //リスナー起動、アグリゲートボンデッドトランザクションの発出を検知
    await listener.open();
    listener.newBlock().subscribe();
    listener.aggregateBondedAdded(scamAddress).subscribe(

        async (partialTx) => {
            //詐欺トランザクションの詳細を取得
            const txs = await transactionHttp.search({
                address:partialTx.innerTransactions[1].signer.address,
                group:sym.TransactionGroup.Confirmed,
                embedded:true,
            }).toPromise();

            //条件を満たした場合に注意喚起            
            if(true){

                //注意喚起のトランザクション生成
                const tx = sym.TransferTransaction.create(
                    sym.Deadline.create(epochAdjustment),
                    partialTx.innerTransactions[1].signer.address, 
                    [],
                    sym.PlainMessage.create('【注意喚起】'),
                    networkType
                );

                //署名
                const signedTx = alertAccount.sign(tx, generationHash);

                //ネットワークへアナウンス
                try {
                    await transactionService.announce(signedHashLockTx, listener).toPromise();
                } catch(err) {
                  console.log(err);
                } finally {
                }
            }
        }
    );
})();

ブロックチェーン上の状態変化を検知し、新たなトランザクションを発生せる定番のパターンですので、ぜひマスターしていろいろな場面で活用してみてください。

11
5
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
11
5