22
8

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 7

送金できないアドレスを判定して弾く

Last updated at Posted at 2021-12-17

#送金できないアドレス
Symbolでは次のような場合に送金が行えない場合があります
・アドレス制限が行われている場合
・アドレスが正しくない場合
・トランザクションの制限が行われている場合

最近はアドレス制限によってスパムのトランザクションを受け付けないようにしている人も増えています.

これらの送金できないアドレスをトランザクションに組み込んでしまった場合,トランザクションの一部であったとしても送金できないといった問題が発生します.特に沢山の人に向けて行うアグリゲートトランザクションではトランザクションが実行できないリスクが非常に高まってしまいます.

#送金できないアドレスを弾く
これらの問題を解決するには,送金できないアドレスを事前に特定してアグリゲートトランザクションに混ぜないように注意するしかありません.また,送金先にも正しいアドレスを伝えてもらうことが必要です.そこで送金できるか判定するHTMLのフォームを作ってみました.

<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<script src="https://xembook.github.io/nem2-browserify/symbol-sdk-1.0.2.js"></script>
<script>
xym = require("/node_modules/symbol-sdk");
const node = 'http://sym-test-01.opening-line.jp:3000';
const repo = new xym.RepositoryFactoryHttp(node);
const restrictionRepo = repo.createRestrictionAccountRepository();

//送信元のアカウント
const senderAddress = xym.Address.createFromRawAddress('TADOWHHWXTN7Z7MAY25W2KL7FKGKILQ74MMYFMY');


async function checkAddressRestriction(){

    var addressStatus = document.getElementById("addressStatus");
    const address = document.getElementById("address").value;
    var res = false;

    if(xym.Address.isValidRawAddress(address.replace(/-/g,''))){
        const targetAddress = xym.Address.createFromRawAddress(document.getElementById("address").value);
        var restrictionsInfo;
        try{
            restrictionsInfo = await restrictionRepo.getAccountRestrictions(targetAddress).toPromise();
        }catch(e){
            console.log("noRestrictionData");
            res = true;
        }

        if(typeof restrictionsInfo !== "undefined"){
            console.log(restrictionsInfo);
            //アドレス制限がある場合
            const restrictions = restrictionsInfo.restrictions;
            for(restriction of restrictions){
                if(restriction.restrictionFlags === xym.AddressRestrictionFlag.AllowIncomingAddress){
                    //allowの許可が必要な場合
                    for(allowAddress of restriction.values){
                        if(allowAddress.address === senderAddress.address)res = true;
                    }
                }
                if(restriction.restrictionFlags === xym.AddressRestrictionFlag.BlockIncomingAddress){
                    //blockされていない必要がある場合
                    res = true;
                    for(blockAddress of restriction.values){
                        if(blockAddress.address === senderAddress.address)res = false;
                    }
                }
            }

        }
    }
    console.log(res);
    if(res)addressStatus.innerHTML = "OK";
    else addressStatus.innerHTML = "NG";
}
   

</script>

</head>
<body>
    <form>
        <input type="text" id="address" name="delegateAddress" class="form3-input" placeholder="ハイフンは入ったままでもOKです" required
            minlength="39" maxlength="45"><br><input type="reset" value="リセット" class="button-1">
        <input type="button" class="button-1" onclick="checkAddressRestriction()" value="チェックする">
    </form>
    <div id="addressStatus"></div>
</body>
</html>

#使い方
上記のコードのsenderAddressを実際に送金を行うアドレスに変更してください.また,メインネットで使用する際はメインネットのノードに変更してください.
アドレスを入力して"チェックする"を押すと送金できるアドレスか判定結果が返ってきます.アドレスが不正な場合もNGになります.

###送金できる場合
スクリーンショット 2021-12-18 7.06.46.png

###送金できない場合

スクリーンショット 2021-12-18 7.07.13.png

今回はアドレス制限とアドレスが問題ないかのみで判断しているので,トランザクション制限が行われたアドレスにはOKとでてしまいます(今後の改善が必要ですね)
スパム対策としてアドレス制限を行なっている方が多いようなのでこれだけでも相当弾けると思います.
#その他
NGの場合は次の画面に進めないような仕組みにしても良いかもしれません.

22
8
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
22
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?