4
Help us understand the problem. What are the problem?

posted at

updated at

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

現在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 {
                }
            }
        }
    );
})();

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?