今天做 StarkNet basecamp 作业时,新建的账户B领不到水了,于是想把之前部署过的 账户A 的ETH转到 账户B。
账户A和B都是通过命令行创建的,不能引入到钱包,只能通过命令行、SDK或第三方命令行工具来 invoke ETH合约的 transfer 函数达到目的。通过命令行是最简单的。
账户B通过 starknet new_account --account v0.11.0.2
指令创建的,在 ~/.starknet_accounts/starknet_open_zeppelin_accounts.json 中,会自动添加一条记录如下
"v0.11.0.2": {
"private_key": "0x6c.......c46",
"public_key": "0x66e22d3fabc4575d48c8b015d830f06dfcd07fe2bcb1b707363cbdee237c2a8",
"salt": "0x6ebe039e6862dbcc51da66b6729e2ae9c329e6f85d1c7c658055b9ddfdcef93",
"address": "0xe669f0765742557ea1c44320b5bcf2ca2c5d5725f016a21bb48bcb07932400",
"deployed": false
}
同样也能找到之前的账户A,名字是version_11
"version_11": {
"private_key": "0x5a....4ff",
"public_key": "0x6e5c1e7e741190090f45bd323661203417e7e88c76bf872356d1c84e7462bf2",
"salt": "0x35ff7c0aeadc5144ea68682a744f4bda3b2b07dadf17ab11dc90ce862fac7c9",
"address": "0x4f5084d55c9b67e147660e6429a18b3c868c36da70888548b48a43b89ec4cea",
"deployed": true
}
StarkScan浏览器中查询账户A,在Portfolio中就能找到ETH的合约地址(StarkNet中的ETH是Token)。
ETH是可升级合约,找到的代理(Proxy)合约的 abi 中并没有 Transfer。在Read/Write Contract中找到逻辑合约(Implementation)地址。如果需要abi,可以到逻辑合约的页面去下载。
能在该页面找到 tranfer,参数recipient是Felt,amount是Uint256。
使用 invoke 去调用 transfer 函数就可以完成转账了。
转账命令如下,
starknet invoke --address 0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 --function transfer --inputs 2242186224124962059324130445823883801135621115872240251912124809464678993130 100000000000000000 0 --account version_11
--address 是ETH合约地址,--account是签名的账户A的名字
--input 的参数需要转换成Decimal。recipient是地址,用Python的int进行转换。amount是uint256,需要2个felt参数,第一个是int(ETH数量e18)
,第二个填0。
转账成功
接下来就有gas部署账户B了。
其他的合约交互也可以用类似方法完成。