Что такое эквивалент py-algorand-sdk». /список учетных записей целей песочницы»

#python #algorand

Вопрос:

TLDR; Я запускаю алгоритм приватной сети в песочнице. Я хотел бы знать, как я могу использовать Python SDK для Algorand для возврата адреса и баланса учетных записей в этой сети.

Более длинная версия; До сих пор я использовал "./sandbox goal account list" для поиска адресов учетных записей и остатков на счетах в Bash, это возвращает:

[в автономном режиме] I3CMDHG236HVBDMCKEM22DLY5L2OJ3CBRUDHG4PVVFGEZ4QQR3X3KNHRMU I3CMDHG236HVBDMCKEM22DLY5L2OJ3CBRUDHG4PVVFGEZ4QQR3X3KNHRMU 8012889074131520 microAlgos
[в автономном режиме] 3NSWKJTYMW3PSZZDIE6NCHMRTOZ24VY5G3OJNDSTYRVRXMZBZVPCGQHJJI 3NSWKJTYMW3PSZZDIE6NCHMRTOZ24VY5G3OJNDSTYRVRXMZBZVPCGQHJJI 1001611000000000 microAlgos
[онлайн] 5KLSI3AHMBBDALXBEO2HEA3PBBCBAYT4PIHCD3B25557WGWUZGRTQETPHQ 5KLSI3AHMBBDALXBEO2HEA3PBBCBAYT4PIHCD3B25557WGWUZGRTQETPHQ 100000 microAlgos

Я попытался использовать модули algod и v2client.indexer, как описано ниже, но вместо 3 учетных записей, перечисленных выше, в моем коде перечислены 4 (исходные 3 1). Код:

     #imports
    from algosdk import algod, v2client
    
    # instatiate AlgodClient
    def connect_to_network():
        algod_address = "http://localhost:4001"
        algod_token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
        algod_client = algod.AlgodClient(algod_token, algod_address)
        return algod_client 
    
    # instantiate IndexClient
    def indexer():
        indexer_token = ""
        indexer_address = "http://localhost:8980"
        indexer_client = v2client.indexer.IndexerClient(indexer_token, indexer_address)
        return indexer_client
    
    # returns all account details from indexer
    def account_details():
        raw_details = indexer().accounts() # <-- I think the error is here because this returns 4 addresses.
        account_details = []
        for details in raw_details["accounts"]:
            account_details.append({"address":details["address"], "amount": details["amount"]})
        return account_details
    
    # returns the amount in each account
    def account_amounts(account_address):
        return connect_to_network().account_info(account_address)
    
    # returns account address and amount for each account
    for detail in account_details():
        print(account_amounts(detail["address"])["address"])
        print(account_amounts(detail["address"])["amount"])
 

Это возвращает:

I3CMDHG236HVBDMCKEM22DLY5L2OJ3CBRUDHG4PVVFGEZ4QQR3X3KNHRMU 8013089091731545
NTMTJYBQHWUXEGVG3XRRX5CH6FCYJ3HKCSIOYW4DLAOF6V2WHSIIFMWMPY 1001636000000000
3NSWKJTYMW3PSZZDIE6NCHMRTOZ24VY5G3OJNDSTYRVRXMZBZVPCGQHJJI 1001636000000000
5KLSI3AHMBBDALXBEO2HEA3PBBCBAYT4PIHCD3B25557WGWUZGRTQETPHQ 100000
  1. Как я могу выполнить репликацию "./sandbox goal account list" с помощью py-algorand-sdk?
  2. (Бонусный вопрос) что это за дополнительная таинственная «учетная запись», которая появляется, когда я использую SDK по сравнению с Bash?

Ответ №1:

Проблема выше возникла из-за того, что, как и в случае с ./sandbox goal accounts list я пытался вернуть учетные записи, для которых у меня были ключи локально в KMD, но мой звонок индексатору raw_details = indexer().accounts() возвращал все учетные записи в сети.

Чтобы исправить это, вместо импорта и использования v2client.indexer модуля импортируйте wallet модуль из algosdk библиотеки. Это необходимый импорт:

 from algosdk import algod, kmd, wallet
 

Затем настройте соединения с algod, kmd и вашим кошельком:

 # instatiate AlgodClient
def connect_to_network():
    algod_address = "http://localhost:4001"
    algod_token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    algod_client = algod.AlgodClient(algod_token, algod_address)
    return algod_client 

# instantiate KMDClient <--- this is used as a parameter when instantiating the Wallet Class.
def key_management():
    kmd_address = "http://localhost:4002"
    kmd_token = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    kmd_client = kmd.KMDClient(kmd_token, kmd_address)
    return kmd_client

#get wallet details
def wallet_details():
    wallet_name = 'unencrypted-default-wallet'
    password = ""
    kmd_client = key_management()
    return wallet.Wallet(wallet_name, password, kmd_client)
 

Теперь вы можете вернуть адреса учетных записей, хранящиеся локально в KMD:

 keys = wallet_details().list_keys()
 

Теперь, когда у вас есть адреса, которые вы можете запросить, используйте клиент algod для возврата суммы (микро) Algo проводится по каждому из этих адресов.