Solana 开发学习之通过RPC与Solana交互

打印 上一主题 下一主题

主题 883|帖子 883|积分 2653

Solana 开发学习之通过RPC与Solana交互

相干链接

JSON-RPC 2.0 规范

JSON-RPC 是一种无状态、轻量级远程过程调用 (RPC) 协议。该规范重要界说了几种数据结构及其处理惩罚规则。它与传输无关,因为这些概念可以在同一进程中、通过套接字、通过 http 或在许多差别的消息转达情况中利用。它利用JSON ( RFC 4627 ) 作为数据格式。
接口RPC

节点相干接口

获取集群节点信息

通过getClusterNodes方法可以获得当前网络内,集群节点的相干信息,比如验证者的key,节点IP,节点版本等。
  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0", "id": 1,
  4.         "method": "getClusterNodes"
  5.     }
  6.     '
  7.    
  8. {"jsonrpc":"2.0","result":[{"featureSet":3580551090,"gossip":"67.209.54.90:8001","pubkey":"7pbH563fFai2Gm8aXGi27Toj1i7x55rGp7QQ8ZQt6C7i","pubsub":null,"rpc":null,"shredVersion":503,"tpu":"67.209.54.90:8004","tpuQuic":"67.209.54.90:8010","version":"1.17.21"},{"featureSet":3580551090,"gossip":"37.27.61.250:8000","pubkey":"HPpYXZ944SXpJB3Tb7Zzy2K7YD45zGREsGqPtEP43xBx","pubsub":null,"rpc":null,"shredVersion":503,"tpu":"37.27.61.250:8003","tpuQuic":"37.27.61.250:8009","version":"1.17.22"},
  9. ......
  10. {"featureSet":3011420684,"gossip":"69.197.5.60:8001","pubkey":"FKizb2faoz57ym1bTWcZhei3aUZu7eU5AiY1EYoZsok6","pubsub":null,"rpc":null,"shredVersion":503,"tpu":null,"tpuQuic":null,"version":"1.17.5"}],"id":1}
复制代码
区块相干接口

获取当前区块高度

通过getBlockHeight可以获取当前的区块高度
  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc":"2.0","id":1,
  4.         "method":"getBlockHeight"
  5.     }
  6.     '
  7. {"jsonrpc":"2.0","result":268621259,"id":1}
复制代码
获取最近的Block Hash

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "id":1,
  4.         "jsonrpc":"2.0",
  5.         "method":"getLatestBlockhash",
  6.         "params":[
  7.         {
  8.             "commitment":"processed"
  9.         }
  10.         ]
  11.     }
  12.     '
  13. {"jsonrpc":"2.0","result":{"context":{"apiVersion":"1.17.21","slot":280325472},"value":{"blockhash":"9ebRPaCY2pcKAPhWzjDtmLArbSzAH1Mb5n8PZzXKbW8X","lastValidBlockHeight":268622097}},"id":1}
复制代码
获取指定高度block的信息

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0","id":1,
  4.         "method":"getBlock",
  5.         "params": [
  6.             174302734,
  7.             {
  8.                 "encoding": "jsonParsed",
  9.                 "maxSupportedTransactionVersion":0,
  10.                 "transactionDetails":"full",
  11.                 "rewards":false
  12.             }
  13.         ]
  14.     }
  15.     '
复制代码
获取指定block简直认状态

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0", "id": 1,
  4.         "method": "getBlockCommitment",
  5.         "params":[174302734]
  6.     }
  7.     '
  8. {"jsonrpc":"2.0","result":{"commitment":null,"totalStake":158091345604635247},"id":1}
复制代码
一次性获取多个Block的信息

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0", "id": 1,
  4.         "method": "getBlocks",
  5.         "params": [
  6.             174302734, 174302735
  7.         ]
  8.     }
  9.     '
  10. {"jsonrpc":"2.0","result":[174302734,174302735],"id":1}
复制代码
分页获取Block

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.   {
  3.     "jsonrpc": "2.0",
  4.     "id":1,
  5.     "method":"getBlocksWithLimit",
  6.     "params":[174302734, 3]
  7.   }
  8. '
  9. {"jsonrpc":"2.0","result":[174302734,174302735,174302736],"id":1}
复制代码
Slot和Epoch相干接口

获取当前Epoch信息

epoch在一样平常POS中比力常见,表示这个周期内,一些参与验证的节点信息是固定的,如果有新 节点或者节点权重变动,将在下一个epoch中见效。
  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {"jsonrpc":"2.0","id":1, "method":"getEpochInfo"}
  3.     '
  4. {"jsonrpc":"2.0","result":{"absoluteSlot":280331471,"blockHeight":268627796,"epoch":648,"slotIndex":395471,"slotsInEpoch":432000,"transactionCount":13011134475},"id":1}
复制代码
获取Epoch的调度信息

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc":"2.0","id":1,
  4.         "method":"getEpochSchedule"
  5.     }
  6.     '
  7. {"jsonrpc":"2.0","result":{"firstNormalEpoch":0,"firstNormalSlot":0,"leaderScheduleSlotOffset":432000,"slotsPerEpoch":432000,"warmup":false},"id":1}
复制代码
获取最新Slot

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.         {"jsonrpc":"2.0","id":1, "method":"getSlot"}
  3.     '
  4. {"jsonrpc":"2.0","result":280333661,"id":1}
复制代码
账号相干接口

获取Account信息

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0",
  4.         "id": 1,
  5.         "method": "getAccountInfo",
  6.         "params": [
  7.             "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD",
  8.             {
  9.                 "encoding": "base58",
  10.                 "commitment": "finalized"
  11.             }
  12.         ]
  13.     }
  14.     '
  15. {"jsonrpc":"2.0","result":{"context":{"apiVersion":"1.17.21","slot":280334128},"value":{"data":["","base58"],"executable":false,"lamports":1984429840,"owner":"11111111111111111111111111111111","rentEpoch":18446744073709551615,"space":0}},"id":1}
复制代码
"executable"表示 是否为可执行合约
"lamports"表示余额,这里精度*10^9
所有普通账号的Owner都是系统根账号: "11111111111111111111111111111111"
获取账号余额

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.     {
  3.         "jsonrpc": "2.0", "id": 1,
  4.         "method": "getBalance",
  5.         "params": [
  6.             "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD"
  7.         ]
  8.     }
  9.     '
  10. {"jsonrpc":"2.0","result":{"context":{"apiVersion":"1.17.21","slot":280334989},"value":1984429840},"id":1}
复制代码
获取某个合约管理的所有Account

  1. curl  https://api.devnet.solana.com  -X POST -H "Content-Type: application/json" -d '
  2.         {
  3.             "jsonrpc": "2.0",
  4.             "id": 1,
  5.             "method": "getProgramAccounts",
  6.             "params": [
  7.             "namesLPneVptA9Z5rqUDD9tMTWEJwofgaYwp8cawRkX",
  8.             {
  9.                 "encoding": "jsonParsed",
  10.                 "filters": [
  11.                 {
  12.                     "dataSize": 128
  13.                 }
  14.                 ]
  15.             }
  16.             ]
  17.         }
  18.     '
复制代码
SPL-Token相干接口

获取某个Token Account账号的余额
  1. curl  https://api.devnet.solana.com  -X POST -H "Content-Type: application/json" -d '
  2.         {
  3.             "jsonrpc": "2.0", "id": 1,
  4.             "method": "getTokenAccountBalance",
  5.             "params": [
  6.                 "HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh"
  7.             ]
  8.         }
  9.     '
  10. {"jsonrpc":"2.0","result":{"context":{"apiVersion":"1.17.21","slot":280346391},"value":{"amount":"90000000000","decimals":9,"uiAmount":90.0,"uiAmountString":"90"}},"id":1}
复制代码
生意业务相干接口

返回分类账中的当前生意业务计数

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.   {"jsonrpc":"2.0","id":1, "method":"getTransactionCount"}
  3. '
  4. {"jsonrpc":"2.0","result":13011550533,"id":1}
复制代码
返回已确认生意业务的生意业务具体信息

  1. curl https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.   {
  3.     "jsonrpc": "2.0",
  4.     "id": 1,
  5.     "method": "getTransaction",
  6.     "params": [
  7.       "4jbcoJYS6ZGPcUmHpqTnxeLHfQxvUqQQnzgoJCgWWA1LpKkKWRA5y2FZ7rDQ2v4NBBcuUJqh37A9p92mvbTmS6iY",
  8.       "json"
  9.     ]
  10.   }
  11. '
  12. {"jsonrpc":"2.0","result":{"blockTime":1708498774,"meta":{"computeUnitsConsumed":26670,"err":null,"fee":5000,"innerInstructions":[{"index":0,"instructions":[{"accounts":[6],"data":"84eT","programIdIndex":4,"stackHeight":2},{"accounts":[0,2],"data":"11119os1e9qSs2u7TsThXqkBSRVFxhmYaFKFZ1waB2X7armDmvK3p5GmLdUxYdg3h7QSrL","programIdIndex":3,"stackHeight":2},{"accounts":[2],"data":"P","programIdIndex":4,"stackHeight":2},{"accounts":[2,6],"data":"6dE9a3kQ4bw3BRvx61TGMGrZBgsnwYEPx2MMEsN75K3Ui","programIdIndex":4,"stackHeight":2}]}],"loadedAddresses":{"readonly":[],"writable":[]},"logMessages":["Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL invoke [1]","Program log: CreateIdempotent","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: GetAccountDataSize","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1595 of 394517 compute units","Program return: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA pQAAAAAAAAA=","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program 11111111111111111111111111111111 invoke [2]","Program 11111111111111111111111111111111 success","Program log: Initialize the associated token account","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeImmutableOwner","Program log: Please upgrade to SPL Token 2022 for immutable owner support","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 1405 of 387904 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [2]","Program log: Instruction: InitializeAccount3","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 4214 of 384020 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL consumed 20498 of 400000 compute units","Program ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL success","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]","Program log: Instruction: TransferChecked","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 6172 of 379502 compute units","Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success"],"postBalances":[1984429840,2039280,2039280,1,934087680,731913600,1461600,10000000],"postTokenBalances":[{"accountIndex":1,"mint":"E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx","owner":"6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","uiTokenAmount":{"amount":"90000000000","decimals":9,"uiAmount":90.0,"uiAmountString":"90"}},{"accountIndex":2,"mint":"E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx","owner":"H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","uiTokenAmount":{"amount":"10000000000","decimals":9,"uiAmount":10.0,"uiAmountString":"10"}}],"preBalances":[1986474120,2039280,0,1,934087680,731913600,1461600,10000000],"preTokenBalances":[{"accountIndex":1,"mint":"E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx","owner":"6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD","programId":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","uiTokenAmount":{"amount":"100000000000","decimals":9,"uiAmount":100.0,"uiAmountString":"100"}}],"rewards":[],"status":{"Ok":null}},"slot":280114248,"transaction":{"message":{"accountKeys":["6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD","HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh","HY1GfCQabyUMFRGpDu3eFoVW3ny8ifHKVZ8LbvzbDPsK","11111111111111111111111111111111","TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL","E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx","H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k"],"header":{"numReadonlySignedAccounts":0,"numReadonlyUnsignedAccounts":5,"numRequiredSignatures":1},"instructions":[{"accounts":[0,2,7,6,3,4],"data":"2","programIdIndex":5,"stackHeight":null},{"accounts":[1,6,2,0],"data":"g7c6qhYoikLGp","programIdIndex":4,"stackHeight":null}],"recentBlockhash":"4Y34ks76nadvQXmcbFAX1XmkegHHsQMA1sM4cA3CqYL9"},"signatures":["4jbcoJYS6ZGPcUmHpqTnxeLHfQxvUqQQnzgoJCgWWA1LpKkKWRA5y2FZ7rDQ2v4NBBcuUJqh37A9p92mvbTmS6iY"]}},"id":1}
复制代码
推送RPC


  • accountSubscribe : 订阅Account的变革,比如lamports
  • logsSubscribe : 订阅生意业务的日志
  • programSubscribe : 订阅合约Account的变革
  • signatureSubscribe : 订阅签名状态变革
  • slotSubscribe : 订阅slot的变革
每个变乱,还有对应的Unsubscribe动作,取消订阅。将上面的Subscribe替换成Unsubscribe即可。
安装wscat
  1. npm install -g ws wscat
复制代码
建立连接
  1. wscat -c wss://api.devnet.solana.com
复制代码
订阅合约所属于Account变乱
  1. {
  2.         "jsonrpc": "2.0",
  3.         "id": 1,
  4.         "method": "programSubscribe",
  5.         "params": [
  6.             "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  7.             {
  8.             "encoding": "jsonParsed"
  9.             }
  10.         ]
  11.     }
复制代码

练习

通过curl和wscat命令行来模仿一个监视钱包动作
创建账号


  • SOL账号: 6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD
  • SPL-Token(Mint Account): E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx
  • Token Account: HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh
实时展示余额变革(订阅SOL余额变革)

获取1sol
  1. solana airdrop 1
  2. Requesting airdrop of 1 SOL
  3. Signature: 4ZWQHwNYVWcs6THZ5A3C6ccHfovJi3HVgZ55LV8NAcZA95iLjyX9Ey6cUnGV7T4JnZnv97443kQ94pKkDG4x7K7Y
  4. 2.98442984 SOL
复制代码
订阅Account变革
  1. {
  2.   "jsonrpc": "2.0",
  3.   "id": 1,
  4.   "method": "accountSubscribe",
  5.   "params": [
  6.     "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD",
  7.     {
  8.       "encoding": "jsonParsed",
  9.       "commitment": "finalized"
  10.     }
  11.   ]
  12. }
复制代码

列出已知SPL-Token的余额
  1. spl-token balance E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx
  2. 90
复制代码
获取SPL-Token下有多少 Token Account:
  1. curl  https://api.devnet.solana.com -X POST -H "Content-Type: application/json" -d '
  2.         {
  3.             "jsonrpc": "2.0",
  4.             "id": 1,
  5.             "method": "getTokenAccountsByOwner",
  6.             "params": [
  7.             "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD",
  8.             {
  9.                 "mint": "E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx"
  10.             },
  11.             {
  12.                 "encoding": "jsonParsed"
  13.             }
  14.             ]
  15.         }
  16.     '
  17. {"jsonrpc":"2.0","result":{"context":{"apiVersion":"1.17.21","slot":280355742},"value":[{"account":{"data":{"parsed":{"info":{"isNative":false,"mint":"E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx","owner":"6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD","state":"initialized","tokenAmount":{"amount":"90000000000","decimals":9,"uiAmount":90.0,"uiAmountString":"90"}},"type":"account"},"program":"spl-token","space":165},"executable":false,"lamports":2039280,"owner":"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch":18446744073709551615,"space":165},"pubkey":"HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh"}]},"id":1}
复制代码
实时展示SPL-Token余额变革
  1. {
  2.   "jsonrpc": "2.0",
  3.   "id": 1,
  4.   "method": "accountSubscribe",
  5.   "params": [
  6.     "HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh",
  7.     {
  8.       "encoding": "jsonParsed",
  9.       "commitment": "finalized"
  10.     }
  11.   ]
  12. }
复制代码
转账生意业务
  1. spl-token transfer --fund-recipient E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx 1 H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k
  2. Transfer 1 tokens
  3.   Sender: HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh
  4.   Recipient: H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k
  5.   Recipient associated token account: HY1GfCQabyUMFRGpDu3eFoVW3ny8ifHKVZ8LbvzbDPsK
  6. Signature: 4WeFPgn7VGbXVqgmtspeKYm38PE9NqxjFfXxZg9QAiy8f5Um7Q3n8hWgiGnzV3SBXdQ7SHGVF22X2pTxpQbwTwGU
  7. spl-token transfer --fund-recipient E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx 1 H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k
  8. Transfer 1 tokens
  9.   Sender: HDv1RgdHjrjSdnTFJsMqQGPcKTiuF7zLjhNaSd7ihbKh
  10.   Recipient: H6Su7YsGK5mMASrZvJ51nt7oBzD88V8FKSBPNnRG1u3k
  11.   Recipient associated token account: HY1GfCQabyUMFRGpDu3eFoVW3ny8ifHKVZ8LbvzbDPsK
  12. Signature: 5gamUZFLAiXraD3DCQ9XEyaqodDX6iQuvLqapyeLokbdot4HAQEqUvBndXgr1uXa6owcR5YaG7BT5i5d6bEQUMwv
复制代码
注意:转账2次,第一次监听连接断开故没有监控到。
查询余额
  1. spl-token balance E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx
  2. 88
复制代码
websocket 监控收到
  1. {
  2.   "jsonrpc": "2.0",
  3.   "method": "accountNotification",
  4.   "params": {
  5.     "result": {
  6.       "context": {
  7.         "slot": 280357854
  8.       },
  9.       "value": {
  10.         "lamports": 2039280,
  11.         "data": {
  12.           "program": "spl-token",
  13.           "parsed": {
  14.             "info": {
  15.               "isNative": false,
  16.               "mint": "E7eHC3g4QsFXuaBe3X2wVr54yEvHK8K8fq6qrgB64djx",
  17.               "owner": "6SWBzQWZndeaCKg3AzbY3zkvapCu9bHFZv12iiRoGvCD",
  18.               "state": "initialized",
  19.               "tokenAmount": {
  20.                 "amount": "88000000000",
  21.                 "decimals": 9,
  22.                 "uiAmount": 88,
  23.                 "uiAmountString": "88"
  24.               }
  25.             },
  26.             "type": "account"
  27.           },
  28.           "space": 165
  29.         },
  30.         "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  31.         "executable": false,
  32.         "rentEpoch": 18446744073709552000,
  33.         "space": 165
  34.       }
  35.     },
  36.     "subscription": 601464
  37.   }
  38. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

刘俊凯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表