24
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

nemAdvent Calendar 2021

Day 15

スキャムほいほいコントラクトの作り方

Last updated at Posted at 2021-12-15

多くは語りません。
不信なアグリゲートボンデッドトランザクションを受信したら、
資産を退避させて別のアカウントでハーベスト設定をするためのサンプルプログラムです。
(このサンプルプログラムでは実際のハーベスト設定を完了することはできません)

このサンプルプログラムは大きな資産の移動を伴います。
新規作成した秘密鍵の保管に関しては説明しておりません。
自己責任で検証ください。

コントラクト詳細

  • 新規アカウントを作成し、1万XYM以上を入金する
  • ハーベスト設定のためのトランザクションを発生させる
  • 不信なアグリゲートボンデッドトランザクションを受信したら資産を退避させる
  • 上記を無限ループ

これは「スマコン」では無いと一部の人から言われそうなので、「スマート」という言葉は使用していません。

ソースコード

事前に以下のページで環境構築しておいてください。


alice = sym.Account.createFromPrivateKey(
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
networkType
);


function hoihoi(){

    dummy =  sym.Account.generateNewAccount(networkType);
    console.log(dummy.address);
    console.log(dummy.privateKey);
    dummy2 =  sym.Account.generateNewAccount(networkType);

    tx = sym.TransferTransaction.create(
        sym.Deadline.create(epochAdjustment),
        dummy.address, 
        [networkCurrency.createRelative(14000)],
        sym.EmptyMessage,
        networkType
    ).setMaxFee(100);
    signedTx = alice.sign(tx,generationHash);

    listener.open().then(() => {
        transactionService.announce(signedTx,listener)
        .subscribe(x=>{
            console.log(x)


            accTx = sym.AccountKeyLinkTransaction.create(
                sym.Deadline.create(epochAdjustment),
                dummy2.publicAccount.publicKey,
                sym.TransactionVersion.ACCOUNT_KEY_LINK,
                networkType
            );

          vrfTx = sym.VrfKeyLinkTransaction.create(
            sym.Deadline.create(epochAdjustment),
            dummy2.publicAccount.publicKey,
            sym.LinkAction.Link,
            networkType
          );

            nodTx = sym.NodeKeyLinkTransaction.create(
                sym.Deadline.create(epochAdjustment),
                dummy2.publicAccount.publicKey,
                sym.LinkAction.Link,
                networkType,
            );

            aggregateArray = [
                accTx.toAggregate(dummy.publicAccount),
                vrfTx.toAggregate(dummy.publicAccount),
                nodTx.toAggregate(dummy.publicAccount),
            ]

            aggregateTx = sym.AggregateTransaction.createComplete(
                sym.Deadline.create(epochAdjustment),
                aggregateArray,
                networkType,[],
            ).setMaxFeeForAggregate(100, 0);


            signedTx2 = dummy.sign(aggregateTx,generationHash);
            txRepo.announce(signedTx2).subscribe(x=>console.log(x));
            clog(signedTx2);


            listener.aggregateBondedAdded(dummy.address)
            .subscribe(xx=>{

                console.log(xx);
                refundTx = sym.TransferTransaction.create(
                    sym.Deadline.create(epochAdjustment),
                    alice.address, 
                    [networkCurrency.createRelative(13,999.9392)],
                    sym.EmptyMessage,
                    networkType
                ).setMaxFee(100);
                signedTx3 = dummy.sign(refundTx,generationHash);
                clog(signedTx3); 
                transactionService.announce(signedTx3,listener)
                .subscribe(x=>{
                    console.log("done.");
                    hoihoi();
                });
            });
        })
    });
}


リファンド

このコントラクトは一度始めたら、プログラムを終了するまで止まりません。
プログラム停止後、以下のトランザクションを実行して預けたままの資産を回収してください。

秘密鍵が必要です。上記終了時に秘密鍵を無くさないようにご注意ください

dummy = sym.Account.createFromPrivateKey(
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  networkType
);

tx = sym.TransferTransaction.create(
	sym.Deadline.create(epochAdjustment),
	alice.address, 
	[networkCurrency.createRelative(13999.87)],
	sym.EmptyMessage,
	networkType
).setMaxFee(100);
signedTx = dummy.sign(tx,generationHash);
txRepo.announce(signedTx).subscribe(x=>console.log(x));
clog(signedTx); 

以上です。
自動でHashLockトランザクションを発生させる行為は、そのトリガーを解析されると資産を失う結果になりかねません。
失った資産はハーベスト報酬となるため、攻撃者にメリットはありませんが、攻撃対象の評価を相対的に下げることは可能です。
ご注意ください。

24
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
24
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?