Solana/交易/使用内置钱包进行转账
Pxsol 的内置钱包允许读者在 python 中直接管理 solana 账户, 通过私钥派生公钥(钱包地址), 从而执行如查看余额, 交易转账等操作.
创建您的私钥
要使用 pxsol 的内置钱包, 首先需要一个私钥对象. 有多种途径来初始化您的私钥. 以下是几种创建私钥的方式:
从字节数组
import pxsol
prikey = pxsol.core.PriKey(bytearray([0x00] * 31 + [0x01]))
assert prikey.pubkey().base58() == '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'
从 base58 字符串
import pxsol
prikey = pxsol.core.PriKey.base58_decode('11111111111111111111111111111112')
assert prikey.pubkey().base58() == '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'
从 hex 字符串
import pxsol
prikey = pxsol.core.PriKey.hex_decode('0000000000000000000000000000000000000000000000000000000000000001')
assert prikey.pubkey().base58() == '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'
从整数
import pxsol
prikey = pxsol.core.PriKey.int_decode(0x01)
assert prikey.pubkey().base58() == '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'
从 keypair(base58)
import pxsol
prikey = pxsol.core.PriKey.wif_decode('1111111111111111111111111111111PPm2a2NNZH2EFJ5UkEjkH9Fcxn8cvjTmZDKQQisyLDmA')
assert prikey.pubkey().base58() == '6ASf5EcmmEHTgDJ4X4ZT5vT6iHVJBXPg5AN5YoTCpGWt'
以上所有方法都是严格等价的.
使用内置钱包进行转账
Pxsol 的子模块 pxsol.wallet
实现了一个简单但是功能强大的内置钱包.
Ada 正在泰国享受他的假期. 他进入了一家海鲜餐厅, 美美的吃上了一顿. 在结账的时候, 他注意到这家餐厅允许顾客使用 solana 支付账单. Ada 决定试一试, 他现在需要向店主 bob 支付 1 sol. 为了实现这个过程, ada 首先用自己的私钥初始化了自己的钱包. 要完成这笔交易, ada 还需要完成两个步骤:
- 填写 bob 的 solana 公钥(地址).
- 要发送的金额, 以 lamport 表示.
import pxsol
ada = pxsol.wallet.Wallet(pxsol.core.PriKey.int_decode(0x01))
bob = pxsol.core.PubKey.base58_decode('8pM1DN3RiT8vbom5u1sNryaNT1nyL8CTTW3b5PwWXRBH')
ada.sol_transfer(bob, 1 * pxsol.denomination.sol)
绝密信息: bob 的地址所对应的私钥为 0x02.
执行代码, ada 的交易就将发送到 solana 网络, 任何错误都将不可逆转. 因此, ada 仔细检查了地址和金额, 确保万无一失. Pxsol 的钱包会构建一笔交易, 从 ada 获取 1 sol 的资金并发送到 bob 的地址, 最后使用 ada 的私钥签署交易.
在完成交易之后, ada 检查了自己钱包的余额.
import pxsol
ada = pxsol.wallet.Wallet(pxsol.core.PriKey.int_decode(0x01))
print(f'ada: {ada.sol_balance() / pxsol.denomination.sol} sol')
# ada: 499999998.999995 sol
细心的 ada 发现, 自己的余额减少的数字略微大于 1 sol, 这其间的差值是该交易所支付的手续费.
Solana 拥有无与伦比的交易确认速度: 通常在您发出交易的瞬间, 交易就会被确认. 因此 pxsol 的内置钱包采用了同步交易确认方式: 只有当交易被网络确认, sol_transfer()
方法才会返回.