symbol ブロックチェーン上のアドレスの受信制限の有無を調べる。(23年2月)


## 概要
前回、symbolブロックチェーンの[アグリゲートトランザクション](https://qiita.com/ULUNTA2/items/96b45dd6765b96ebeb49)について書きました。このアグリゲートトランザクションは便利なんですが、1件でもアドレスに不備があると、うまくいきません。タイプミスやコピペミスだけでなく、アドレス自体に制限がかかっていて送れない場合があります。今回はアドレスの受信制限やコピペミスを判定する内容を記事にします。

## 環境・前提条件
windows10
Python 3.10.9
requests 2.28.2
beautifulsoup4 4.11.1
symbol-desktop-wallet 1.0.13

- 【コード(testnet_address_scan.py)】
ノードにアクセスして受信制限を調べます。
受信制限あり、受信制限なし、アドレス間違いの判定をしています。
まず、pythonのライブラリであるbeautifulsoup4のインストールをします。
```
pip install beautifulsoup4
```

```
import requests
from bs4 import BeautifulSoup


node = "https://sym-test-04.opening-line.jp:3001"
node_restrictions = "/restrictions/account/"

#アドレスリスト[address, amount, message]
check_addresses_list = [
    ["TAFQV**********X3L7Q2BPVONS3FLM6VM5QKHQ", 1, "dog" ],
    ["TA6US**********WUG5G7AEOMWVA4FYWO2EWM4I", 5, "cat"],
    ["TDTFC**********J353SR5VNMPXOBDEIVXYDXMQ", 7, "bird" ] ,
    ["TA22Z**********GLVSAFZ7CNR2TQIIWYVMTTVI", 9, "rat" ] ,
    ["TDTFC**********J353SR5VNMPXOBDEIVXYDXM-", 7, "bird" ] 
    ]

for check_address in check_addresses_list:
    
    address = check_address[0]
    restrictions_url = str(node + node_restrictions + address)
    get_html = requests.get(restrictions_url)

    #ノードからの取得データをスクレイピング
    soup = BeautifulSoup(get_html.content, "html.parser")
    str_soup = str(soup)
    
    if "ResourceNotFound" in str_soup:
        print(address + " は受信制限無いよ！")

    elif "accountRestrictions" in str_soup:
        print(address + " は受信制限あるよ！！！！！")
    
    elif "InvalidArgument" in str_soup:
        print(address + " はアドレス違うかも！")
    
    else:
        print("チョットヨクワカラナイ。。。")
```

## ターミナル出力

```
TAFQV**********X3L7Q2BPVONS3FLM6VM5QKHQ は受信制限無いよ！
TDTFC**********J353SR5VNMPXOBDEIVXYDXMQ は受信制限無いよ！
TA22Z**********GLVSAFZ7CNR2TQIIWYVMTTVI は受信制限あるよ！！！！！
TDTFC**********J353SR5VNMPXOBDEIVXYDXM- はアドレス違うかも！
```

## コード(mainnet_address_scan.py)
node・check_addresses_list[]内のaddressを変えればmainnet用になります。
```
node = "mainnet node"
check_addresses_list = [["mainnet_address", "amount", "message"]]
```

一斉送信をする前に、試してみてはいかがでしょうか。

## 引用リンク

PythonでWebスクレイピングをやってみる
https://qiita.com/koichi_hiphopdream/items/f4b006159cdbf5e4ee30

Symbol documentation アカウント制限
https://docs.symbol.dev/concepts/account-restriction.html

Desktop wallet v1.0.13 リンク
https://github.com/symbol/desktop-wallet/releases

Catapult REST Endpoints (1.0.3)
https://symbol.github.io/symbol-openapi/v1.0.3/#tag/Restriction-Account-routes/operation/getAccountRestrictions

## 補足：ウォレットでの受信制限のかけ方
画像のように、受信制限をかけたいアドレスの右上にある+マークから追加します。
今回は特定のアドレスからしかトランザクションを受信しない方法です。

![アカウント制限 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794143/d1c1857d-aac8-11fd-59a7-a37a74835d03.png)

ウォレットのアカウント情報の画面のアカウント制限を選択します。

![アカウント制限 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794143/f868b960-b715-d13e-368a-e33a593c6865.png)

新規アドレス制限をクリック。

![アカウント制限 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794143/283ecaad-7247-0ec7-642d-a372ce377cd2.png)

今回は指定した宛先のみ受信を許可するに設定します。
![アカウント制限 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794143/125c5157-aece-e600-e5bf-b726af957f30.png)

パスワードを入れ、署名すれば指定したアドレスのみからの受信しかしない設定に出来ます。