{
"title": "StarkNet 命令行转账方法",
"tags": [
"post",
"StarkNet",
"Guide"
],
"summary": "介绍StarkNet通过命令行转账ETH的方法",
"sources": [
"xlog"
],
"external_urls": [
"https://scriptmoney.xlog.app/StarkNet-CLI-transfer-guide"
],
"date_published": "2023-04-14T04:22:00.000Z",
"content": "今天做 StarkNet basecamp 作业时,新建的账户B领不到水了,于是想把之前部署过的 账户A 的ETH转到 账户B。\n\n账户A和B都是通过命令行创建的,不能引入到钱包,只能通过命令行、SDK或第三方命令行工具来 invoke ETH合约的 transfer 函数达到目的。通过命令行是最简单的。\n\n账户B通过 `starknet new_account --account v0.11.0.2`指令创建的,在 *~/.starknet_accounts/starknet_open_zeppelin_accounts.json* 中,会自动添加一条记录如下\n```json\n\"v0.11.0.2\": {\n \"private_key\": \"0x6c.......c46\",\n \"public_key\": \"0x66e22d3fabc4575d48c8b015d830f06dfcd07fe2bcb1b707363cbdee237c2a8\",\n \"salt\": \"0x6ebe039e6862dbcc51da66b6729e2ae9c329e6f85d1c7c658055b9ddfdcef93\",\n \"address\": \"0xe669f0765742557ea1c44320b5bcf2ca2c5d5725f016a21bb48bcb07932400\",\n \"deployed\": false\n}\n```\n\n同样也能找到之前的账户A,名字是*version_11*\n```json\n\"version_11\": {\n \"private_key\": \"0x5a....4ff\",\n \"public_key\": \"0x6e5c1e7e741190090f45bd323661203417e7e88c76bf872356d1c84e7462bf2\",\n \"salt\": \"0x35ff7c0aeadc5144ea68682a744f4bda3b2b07dadf17ab11dc90ce862fac7c9\",\n \"address\": \"0x4f5084d55c9b67e147660e6429a18b3c868c36da70888548b48a43b89ec4cea\",\n \"deployed\": true\n}\n```\n\n[StarkScan浏览器](https://testnet.starkscan.co/contract/0x04f5084d55c9b67e147660e6429a18b3c868c36da70888548b48a43b89ec4cea#portfolio)中查询账户A,在*Portfolio*中就能找到[ETH的合约地址](https://testnet.starkscan.co/contract/0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7)(StarkNet中的ETH是Token)。\n\n![porfolio](ipfs://bafkreiclcf7ia42uzkyatht5jaxdhm7dvo6bkdv2ibc23kfduzfuie3fiy)\n\nETH是可升级合约,找到的代理(Proxy)合约的 abi 中并没有 *Transfer*。在*Read/Write Contract*中找到[逻辑合约(Implementation)地址](https://testnet.starkscan.co/contract/0x000fa904eea70850fdd44e155dcc79a8d96515755ed43990ff4e7e7c096673e7)。如果需要abi,可以到逻辑合约的页面去下载。\n\n能在该页面找到 *tranfer*,参数*recipient*是*Felt*,*amount*是*Uint256*。\n![transfer](ipfs://bafkreifittf3r6qsihkv63pdx3oh746abpbuqe4e3ggie24ryzwzlzq4k4)\n\n使用 invoke 去调用 *transfer* 函数就可以完成转账了。\n\n转账命令如下,\n`starknet invoke --address 0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 --function transfer --inputs 2242186224124962059324130445823883801135621115872240251912124809464678993130 100000000000000000 0 --account version_11`\n\n*--address* 是ETH合约地址,*--account*是签名的账户A的名字\n\n*--input* 的参数需要转换成Decimal。*recipient*是地址,用Python的int进行转换。*amount*是uint256,需要2个felt参数,第一个是`int(ETH数量e18)`,第二个填0。\n\n![convert](ipfs://bafkreihksmovl7fq7fjdstxmlsxqrw7ugrxkoa4vufyr5cszgjenvt6vcy)\n\n转账成功\n![Transfer success](ipfs://bafkreidgukqssg54fo457w5qbzlushbp53nkiwft2m2rdhbhqjmwor3tcm)\n\n接下来就有gas部署账户B了。\n\n其他的合约交互也可以用类似方法完成。",
"attributes": [
{
"value": "StarkNet-CLI-transfer-guide",
"trait_type": "xlog_slug"
}
]
}