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