Skip to content

币的流转和交换

QM edited this page Dec 21, 2020 · 1 revision

币的流转和交换

币和合约的关系

  1. 合约可能产生币
  2. 合约可以使用币

比如

  1. 在bityaun 链上, coins 合约产生 bty 主币
  2. 在bityaun 链上, token 合约产生 CCNY (一种稳定币), ITVB(主播币,一种用于主播应用的几分)

一个地址有多少币, 可以通过 Chain33.GetBalance 接口查询

# 在产生币的合约中查询
# 查询14KEKbYtKKQm4wMthSK9J4La4nAiidGozt 在 coins 中 有多少bty
# 说明:asset_exec asset_symbol 默认为 coins, bty
req='{"method":"Chain33.GetBalance", "params":[{"addresses" : ["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"], "execer" : "coins"}]}'
resp=$(curl -ksd "$req" "${MAIN_HTTP}")

# 在使用币的合约中查询
# 说明:execer 和 asset_exec 一致,表示查询产生币的合约有多少币
# 查询14KEKbYtKKQm4wMthSK9J4La4nAiidGozt 在 trade 合约有多少 token中发现的CCNY
req='{"method":"Chain33.GetBalance", "params":[{"addresses" : ["14KEKbYtKKQm4wMthSK9J4La4nAiidGozt"], "execer" : "trade", "asset_exec": "token", "asset_symbol" : "CCNY"}]}'
resp=$(curl -ksd "$req" "${MAIN_HTTP}")

币的流转

一个地址对应的私钥的拥有者是币的所有者, (保管好自己的私钥). 币的所有者可以对币进行转移和使用。 对币的操作和查询步骤有区别, 查询只需要发送查询请求就可以了, 操作需要发送交易,区块链打包,才能生效。 一般转化为rpc请求分为三个步骤

  1. 构造交易
  2. 签名
  3. 发送
# 构造交易
req='具体的交易'
txHex=$(curl -sd "$req"  ${MAIN_HTTP}  | | jq .result)

# 共同的步骤,下面不再列出
# 签名交易
signHex=$(curl -sd '{"method":"Chain33.SignRawTx","params":[{"expire":"300s", "privkey":"'$owner_key'","txHex":'$txHex'}]}' ${MAIN_HTTP}  |jq .result)

# 发送交易
curl -sd '{"method":"Chain33.SendTransaction","params":[{"data":'$signHex'}]}' ${MAIN_HTTP}

转账

  1. 可以用于付账,输入对方的地址, 在应用上可能上扫对方的二维码地址, (类似扫码支付)
  2. 可以用来打赏主播,主播可以用来发红包
tx=$(curl -ksd '{"method":"Chain33.CreateTransaction","params":[{"execer":"'$exec'","actionName":"Transfer","payload":{"to":"'$to'", "amount":'$amount'}}]}' ${MAIN_HTTP} | jq -r ".result")

转账到合约

  1. 把币从产生币的合约中,转移到使用币的合约中
  2. 一般是你需要在特定的合约中使用, 才将币转移到对应合约
unsignedTx=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"Chain33.CreateTransaction","params":[{"execer": "'"${execName}"'","actionName":"TransferToExec","payload": {"cointoken":"'"${tokenSymbol}"'", "amount": "10", "note": "", "to": "'"${token_addr}"'", "execName": "'"${execName}"'"}}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".result")

从合约提币

  1. 在合约中暂时不使用币, 将币从对应合约转移到产生币的合约
unsignedTx=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"Chain33.CreateTransaction","params":[{"execer": "'"${execName}"'","actionName":"Withdraw","payload": {"cointoken":"'"${tokenSymbol}"'", "amount": "10", "note": "", "to": "'"${token_addr}"'", "execName": "'"${execName}"'"}}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".result")

币的转移过程是

  1. 从产生币的合约转出,到使用币的合约
  2. 从使用币的合约, 向产生币的合约转入

不存在从使用币的合约转移到另一个使用币的合约的操作

在合约中使用:

  1. 不存在我要在这个合约里干什么的疑惑, 因为你是先有使用币的想法,才将币转移到对应的使用币的合约

使用币的合约,举例

  1. 在trade合约中和其他币进行交换
  2. 在token合约里用bty申请发行某token
# 在token合约里用bty申请发行某token
# price 10000*1e8 表示发行token的费用为 10000 bty
# 具体信息看下面链接
https://chain.33.cn/document/102#1.1%20%E7%94%9F%E6%88%90%E9%A2%84%E5%88%9B%E5%BB%BAtoken%20%E7%9A%84%E4%BA%A4%E6%98%93%EF%BC%88%E6%9C%AA%E7%AD%BE%E5%90%8D%EF%BC%89
unsignedTx=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"token.CreateRawTokenPreCreateTx","params":[{"name": "yinhebib", "symbol": "'"${tokenSymbol}"'", "total": 100000000000, "price": 10000*1e8, "category": 1,"owner":"'${tokenAddr}'"}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".result")
# 在trade合约中和其他币进行交换
# 发起买入CCNY
# https://chain.33.cn/document/105#1.12%20%E7%94%9F%E6%88%90%20%E4%B9%B0%E5%85%A5token%E7%9A%84%E4%BA%A4%E6%98%93%EF%BC%88%E6%9C%AA%E7%AD%BE%E5%90%8D%EF%BC%89
res=$(curl -s --data-binary '{"jsonrpc":"2.0","id":2,"method":"trade.CreateRawTradeBuyLimitTx","params":[{"tokenSymbol":"CCNY","amountPerBoardlot":1000000,"minBoardlot":1, "pricePerBoardlot":100000, "totalBoardlot":200, "fee": 1, "assetExec":"token"}]}' -H 'content-type:text/plain;' ${MAIN_HTTP} | jq -r ".error | not")

以上交易生效都需要签名和发送交易上链