今天做 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 了。
其他的合約交互也可以用類似方法完成。