Aptos PythonSDK链上钱包创建验证问题

liujinge@skiff.com

00 更新


01 起因


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

先去看官方的GIthub的Issues发现7.8个相关地址激活的问题,只有一个回答是有点用的。
先去看官方的GIthub的Issues发现7.8个相关地址激活的问题,只有一个回答是有点用的。
  • 在转账时激活账户 —(关键是我都转不了账啊。。。)

  • 或者用插件钱包去转一次钱,就能用了。(科学家怎么能用ui呢。。)

  • 但都没有给出具体完整的解决方法

02 解决方式


  • 无赖只好自己啃下文档,最后发现可调用官方文档中给出的函数自己构造交易

post image
  • 这个过程中有2个坑

    • 官方文档给出要传2个参数,但sdk里只接受一个参数。

    • 虽然可以 使用0x1::aptos_account::transfer 函数在转账时一起激活钱包但,gas并没有便宜太多,所以还是选择在创建钱包时就激活。

post image
  • 完整代码如下

    """
    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)
    

03 后续


  1. 有空的时候写下文档,并在github进行提交这个修改,增加一个激活函数到Account中。

  2. 为什么要激活才能用呢?官方文档写的是防止账户被广泛占用。对于那些撞地址的仔来说,确实0.0015 APT 的gas有点顶不住。