:使用 cleos transfer 轉移 eosio.token 合約代幣)
區(qū)塊鏈【免費下載鏈接】eosAn open source smart contract platform項目地址https://gitcode.com/gh_mirrors/eo/eos點擊查看免費下載本指南以 EOSIO 開源智能合約平臺本倉庫 eo/eos中cleos客戶端的transfer子命令為核心完整演示如何將eosio.token合約發(fā)行的代幣如SYS從一個賬戶轉移到另一個賬戶并深入解析cleos transfer在 programs/cleos/main.cpp 中的底層實現(xiàn)原理、全部命令行參數(shù)以及相關測試用例。閱讀本文后你將掌握轉賬命令的標準寫法、參數(shù)語義、權限模型與常見錯誤規(guī)避方法。前置條件在執(zhí)行轉賬操作之前需要確認以下環(huán)境與知識均已就緒已安裝當前倉庫支持的cleos客戶端。cleos隨 EOSIO 軟件一同構建安裝構建與安裝方式可參考 docs/00_install/index.md。目標網(wǎng)絡你所連接的鏈上已部署eosio.token合約。只有合約部署后代幣的transferaction 才可被調用。發(fā)送方賬戶下文示例中的alice持有足夠數(shù)量的待轉賬代幣且已解鎖錢包并導入對應私鑰cleos wallet unlock/cleos wallet import。理解以下概念交易transaction一次提交到鏈上的原子操作集合轉賬動作被封裝在交易中執(zhí)行。轉賬不可逆代幣轉賬一旦被區(qū)塊確認并達到不可逆狀態(tài)就無法回滾或撤銷發(fā)送前務必核對收款賬戶與金額。核心命令cleos transfercleos transfer是cleos提供的標準代幣轉賬子命令其官方功能描述為 Transfer tokens from account to account從賬戶向賬戶轉移代幣詳見 docs/02_cleos/03_command-reference/transfer.md?;菊Z法cleos transfer sender recipient amount SYMBOL memo -p senderactive其中四個位置參數(shù)依次為參數(shù)說明sender轉出代幣的賬戶名recipient接收代幣的賬戶名amount轉賬數(shù)量格式為數(shù)量 符號如0.0001 SYS必須用引號包裹memo隨交易附帶的消息/備注可選但推薦保留便于對賬標準操作示例以下命令演示從賬戶alice向賬戶bob轉賬0.0001 SYS并附帶備注Hodl!cleos transfer alice bob 0.0001 SYS Hodl! -p aliceactive其中alice 轉出代幣的賬戶bob 接收代幣的賬戶0.0001 SYS 發(fā)送的SYS代幣數(shù)量Hodl! 隨交易附帶的備注memo-p aliceactive 以alice賬戶的active權限為交易授權簽名默認為senderactive此處顯式指定更清晰。示例輸出命令執(zhí)行成功后的典型輸出如下不同網(wǎng)絡與版本可能略有差異此處的輸出為文檔原始示意其中 quantity 展示為25.0000 SYSexecuted transaction: 800835f28659d405748f4ac0ec9e327335eae579a0d8e8ef6330e78c9ee1b67c 128 bytes 1073 us # eosio.token eosio.token::transfer {from:alice,to:bob,quantity:25.0000 SYS,memo:m} # alice eosio.token::transfer {from:alice,to:bob,quantity:25.0000 SYS,memo:m} # bob eosio.token::transfer {from:alice,to:bob,quantity:25.0000 SYS,memo:m}輸出解讀executed transaction: 交易ID交易已在鏈上執(zhí)行成功并給出交易哈希隨后的每一行對應鏈上執(zhí)行時打印的 action 軌跡第一行是eosio.token合約自身執(zhí)行的transferaction接下來是發(fā)送方alice與接收方bob因收到通知notify而打印的相同 action 數(shù)據(jù)。全部命令行參數(shù)詳解除了位置參數(shù)cleos transfer還支持以下選項與 docs/02_cleos/03_command-reference/transfer.md 一致它們在 programs/cleos/main.cpp 中以 CLI11 定義選項含義與默認值-c, --contract控制該代幣的合約賬戶名默認eosio.token。可指定其他實現(xiàn)了相同transfer接口的合約--pay-ram-to-open由發(fā)送方支付 RAM為接收方打開代幣余額行當接收方尚無該代幣的余額記錄時使用-x, --expiration交易過期時間秒默認 30 秒-f, --force-unique強制交易唯一。會消耗額外帶寬防止誤發(fā)相同交易當 memo 為空時自動在 memo 中注入隨機 nonce見下文源碼解析-s, --skip-sign跳過簽名不使用解鎖錢包中的密鑰簽名-j, --json以 JSON 格式打印結果--json-file將結果以 JSON 格式保存到文件-d, --dont-broadcast不廣播交易到網(wǎng)絡僅打印到 stdout--return-packed與--dont-broadcast配合獲取打包后的交易-r, --ref-block指定用于 TAPOSTransaction as Proof-of-Stake的參考區(qū)塊號或區(qū)塊 ID--use-old-rpc使用舊版 RPCpush_transaction而非新版send_transaction-p, --permission授權交易使用的賬戶權限級別默認senderactive--max-cpu-usage-ms交易執(zhí)行的 CPU 用量上限毫秒默認 0 表示不限--max-net-usage交易的網(wǎng)絡帶寬用量上限字節(jié)默認 0 表示不限--delay-sec延遲交易秒數(shù)默認 0 秒簡化數(shù)量參數(shù)當省略符號時cleos會按如下規(guī)則處理源碼to_asset邏輯見下文cleos transfer inita tester 1000即省略符號直接寫數(shù)量。此時cleos會先向鏈上查詢eosio.token合約中該符號的精度信息再對數(shù)量做精度對齊不足精度的自動補齊小數(shù)位。源碼級解析cleos transfer 是如何工作的1. 子命令與參數(shù)定義在 programs/cleos/main.cpp 中transfer子命令被定義為string con eosio.token; // 默認代幣合約 ... auto transfer app.add_subcommand(transfer, localized(Transfer tokens from account to account)); transfer-add_option(sender, sender, localized(The account sending tokens))-required(); transfer-add_option(recipient, recipient, localized(The account receiving tokens))-required(); transfer-add_option(amount, amount, localized(The amount of tokens to send))-required(); transfer-add_option(memo, memo, localized(The memo for the transfer)); transfer-add_option(--contract,-c, con, localized(The contract that controls the token)); transfer-add_flag(--pay-ram-to-open, pay_ram, localized(Pay RAM to open recipients token balance row)); add_standard_transaction_options_plus_signing(transfer, senderactive);從源碼結構可以確認sender、recipient、amount為必填參數(shù)memo可選默認合約名為eosio.token默認授權為senderactive。2. 數(shù)量解析與精度對齊to_asset執(zhí)行回調中先調用to_asset將金額字符串解析為資產對象見 programs/cleos/main.cppasset to_asset( account_name code, const string s ) { static map pairaccount_name, eosio::chain::symbol_code, eosio::chain::symbol cache; auto a asset::from_string( s ); eosio::chain::symbol_code sym a.get_symbol().to_symbol_code(); auto it cache.find( make_pair(code, sym) ); ... auto json call(get_currency_stats_func, ...); // 查詢合約的貨幣統(tǒng)計get_currency_stats ... if ( a.decimals() expected_symbol.decimals() ) { auto factor expected_symbol.precision() / a.precision(); a asset( a.get_amount() * factor, expected_symbol ); } else if ( a.decimals() expected_symbol.decimals() ) { EOS_THROW(symbol_type_exception, Too many decimal digits in ${a}, only $cpe4elpci5g supported, ...); } return a; }要點cleos會通過 RPC 調用合約的get_currency_stats接口查詢符號對應的最大供應量從而獲得該符號的官方精度用戶給出的金額小數(shù)位數(shù)少于官方精度時自動補齊如1000→1000.0000 SYS小數(shù)位數(shù)超過官方精度時直接拋出symbol_type_exception錯誤拒絕執(zhí)行。這正是轉賬時金額精度必須合法的底層保障。3. 構造 transfer actioncreate_transfer隨后調用create_transfer構造鏈上 action見 programs/cleos/main.cppchain::action create_transfer(const string contract, const name sender, const name recipient, asset amount, const string memo ) { auto transfer fc::mutable_variant_object (from, sender) (to, recipient) (quantity, amount) (memo, memo); return action { get_account_permissions(tx_permission, {sender, config::active_name}), name(contract), transfer_n, variant_to_bin( name(contract), transfer_n, transfer ) }; }即向目標合約默認eosio.token發(fā)出transferaction數(shù)據(jù)結構為{from, to, quantity, memo}授權級別取自senderactive。4. --pay-ram-to-open 的底層行為在回調中programs/cleos/main.cpp如果指定了--pay-ram-to-opencleos會先構造并發(fā)送一個openaction再發(fā)送transferif (!pay_ram) { send_actions( { transfer }, signing_keys_opt.get_keys()); } else { auto open_ create_open(con, name(recipient), transfer_amount.get_symbol(), name(sender)); send_actions( { open_, transfer }, signing_keys_opt.get_keys()); }create_openprograms/cleos/main.cpp構造{owner, symbol, ram_payer}結構ram_payer為發(fā)送方sender。這意味著當接收方賬戶從未持有過該代幣其余額行尚未創(chuàng)建時發(fā)送方可以主動承擔 RAM 費用幫對方開戶從而避免轉賬因接收方余額表不存在而失敗。5. 強制唯一--force-unique的實現(xiàn)當指定-f/--force-unique且 memo 為空時cleos會自動生成隨機字符串注入 memo作為交易的 nonceif (tx_force_unique memo.size() 0) { memo generate_nonce_string(); tx_force_unique false; }這保證了兩次相同的轉賬也會因 memo 不同而生成不同交易 ID防止重復廣播同一筆交易代價是額外帶寬消耗。結合測試用例理解轉賬語義倉庫的單元測試 unittests/eosio.token_tests.cpp 覆蓋了eosio.token合約的轉賬語義可幫助理解真實鏈上的行為正常轉賬transfer( alice_n, bob_n, asset::from_string(300 CERO), hola )驗證賬戶間成功轉出、余額更新超額轉賬向余額不足的賬戶發(fā)起701 CERO轉賬會被拒絕非法金額轉賬-1000 CERO負數(shù)同樣會被合約拒絕。這些用例印證了雖然cleos transfer負責構造并廣播交易但金額校驗余額充足、數(shù)量為正、精度正確最終由eosio.token合約在鏈上強制執(zhí)行cleos端只是做了前置的精度對齊。常見問題與注意事項金額必須帶符號并用引號包裹0.0001 SYS中的符號是必須的且cleos會校驗小數(shù)精度省略符號時按默認精度補齊建議顯式書寫符號避免歧義。精度超限會直接報錯若金額小數(shù)位超過合約定義精度cleos拋出Too many decimal digits ... only d supported異常。轉賬不可逆區(qū)塊確認后無法撤銷務必核對recipient與金額memo建議保留原始信息便于審計對賬。接收方無余額記錄時可先由發(fā)送方用--pay-ram-to-open幫助對方開戶或提示接收方先通過其他途徑持有該代幣。授權級別默認使用senderactive簽名若使用自定義權限或合約賬戶發(fā)送務必用-p accountpermission顯式指定。代幣不一定是 SYS-c/--contract可指定控制該代幣的其他合約只要是實現(xiàn)了標準transfer接口的合約均可按本文流程轉賬??偨Y通過cleos transfer用戶可以便捷地將eosio.token合約發(fā)行的代幣在賬戶間轉移。本文從命令語法、參數(shù)選項、示例輸出入手并深入到 programs/cleos/main.cpp 的to_asset、create_transfer、create_open等實現(xiàn)解釋了金額精度對齊、默認授權、--pay-ram-to-open開戶與--force-unique防重等底層機制同時結合 unittests/eosio.token_tests.cpp 說明了鏈上校驗語義。掌握上述內容后即可在實際網(wǎng)絡上安全、正確地完成代幣轉賬操作。贊分享區(qū)塊鏈【免費下載鏈接】eosAn open source smart contract platform項目地址https://gitcode.com/gh_mirrors/eo/eos點擊查看免費下載相關推薦Archon archon-post-review-to-pr 詳解將代碼審查結果自動發(fā)布為 GitHub PR 評論的確定性 Agent 命令模板Archon archon post review to pr 詳解將代碼審查結果自動發(fā)布為 GitHub PR 評論的確定性 Agent 命令模板 本文以區(qū)塊鏈EOSIO cleos get currency balance 命令詳解查詢賬戶代幣余額的完整指南EOSIO cleos get currency balance 命令詳解查詢賬戶代幣余額的完整指南 導讀 cleos get currency balanc區(qū)塊鏈WeChatMsg 完整指南3 步免費導出微信聊天記錄HTML、Word、CSV 永久保存WeChatMsg 完整指南3 步免費導出微信聊天記錄HTML、Word、CSV 永久保存 剛重裝完系統(tǒng)想翻去年和某個人的聊天新微信里只剩最近幾條記錄。區(qū)塊鏈創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考