准备写个Aptos的脚本去抢NFT 发现本地创建的钱包没有在主网没有创建,不能查余额也转不了账。(没想到解决这个问题一个早上就过去了)

在转账时激活账户 —(关键是我都转不了账啊。。。)
或者用插件钱包去转一次钱,就能用了。(科学家怎么能用ui呢。。)
但都没有给出具体完整的解决方法
无赖只好自己啃下文档,最后发现可调用官方文档中给出的函数自己构造交易

这个过程中有2个坑
官方文档给出要传2个参数,但sdk里只接受一个参数。
虽然可以 使用
0x1::aptos_account::transfer函数在转账时一起激活钱包但,gas并没有便宜太多,所以还是选择在创建钱包时就激活。

完整代码如下
""" create in : 2022/10/30 14:10 @author : Psycholab.ljz @description:本地创建钱包并进行激活 """ from aptos_sdk.account import Account from aptos_sdk.client import RestClient from common import MAINNET_NODE_URL def activate_wallet_payload(address: [str]): payload = { "type": "entry_function_payload", "function": "0x1::aptos_account::create_account", "type_arguments": [], "arguments": [ str(address), ] } return payload def create_wallet(filename: [str], number: [int]): main = Account.load(f'wallet/main.txt') print(f"===本地创建 {number} 个新钱包===\\n 【 保存为: {filename}_x.txt 】") for i in range(number): Account.generate().store(f'wallet/{filename}_{i}.txt') print(f"===连接节点===\\n 【 {MAINNET_NODE_URL} 】") rest_client = RestClient(MAINNET_NODE_URL) print(f"===在链上激活钱包===\\n") for i in range(number): account_name = Account.load(path=f'wallet/{filename}_{i}.txt') print(f"===在链上激活钱包 {filename}_{i}===\\n") txn_hash = rest_client.submit_transaction(main, activate_wallet_payload(account_name.address())) rest_client.wait_for_transaction(txn_hash) print(f"===钱包 {filename}_{i} 激活成功===\\n") rest_client.close() create_wallet("test",1)
有空的时候写下文档,并在github进行提交这个修改,增加一个激活函数到Account中。
为什么要激活才能用呢?官方文档写的是防止账户被广泛占用。对于那些撞地址的仔来说,确实0.0015 APT 的gas有点顶不住。
