前言
这篇文章咱聊聊百度链手续费问题
关于百度链往期文章汇总
在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑
以单节点环境运行
以单一变量的方式来研究一个不了解的事物 才是合理的方式
不然多种变量杂糅在一起 只会越来越乱了
单节点即单个出块地址,不需要考虑多个出块节点轮流出块的情况
环境准备
`cd pn1
rm -rf data/blockchain/xuper/
`
修改节点配置
`./xchain-cli createChain
nohup ./xchain --vm ixvm &
`
确认下几个初始金额
- 节点地址 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
- 初始金额 100000000000000000000
- 每出一个块奖励 1000000
- 金额精度是8 即总金额为 1000000000000 个
- proposer_num为1表示一个出块节点
- period为3000表示每三秒出一次块
- alternate_interval为3000 表示出块节点切换耗时3秒 因为当前就一个节点 所以不需要切换
- term_interval为6000 表示节点1最后一个出块结束开始到节点2第一个节点开始之间间隔6秒 即 节点切换时间3秒+3秒出一个块 一共6秒 因为就一个节点所以这个时间也不需要
- block_num为20 表示一个节点出20个块 再轮到另外一个节点出20个块
- vote_unit_price表示每头一次票 所代表的权重即代表多少token值
查看节点账户地址
`cat data/keys/address
dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
`
查看当前区块高度的脚本
`#!/bin/bash
for((i=1;i<=1;i++));
do
echo -n "node$i:";
./xchain-cli status -H 127.0.0.1:3710$i | grep trunkHeight;
done
echo -n '节点账户金额:'
./xchain-cli account balance dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
`
查看初始地址金额
`./xchain-cli account balance dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
`
结果和期望一致
3秒出一个块 出了256个块 100000000000000000000+256*1000000=100000000000256000000
创建一个合约账户(默认由节点账户创建)
`./xchain-cli account new --account 1111111111111111 --fee 1000
`
手续费1000
咱们来看下这个手续费跑哪里去了
来源账户 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
金额是 1000000
这个金额大家可能会有疑问
总金额不是 > 100000000000256000000 这个值吗
(为什么大于 因为在不断的出块嘛)
那为什么是 1000000
原因是 总金额 虽然 > 100000000000256000000
但它是又很多的 面值为1000000的utxo组成
所以这里支付 1000手续费 那么只需要一个 1000000 的 utxo即可
目的账号有2个
一个是 1000手续费 去了 $ 账户
另一个是 999000 表示 1000000的utxo减去手续费1000 还剩这么多
大家有没有疑惑 $ 地址 是啥玩意
其实这个表示未知地址
因为此时发起一个创建一个合约账户的交易,同步返回一个交易hash
此时这个交易还未被打包做为块的一部分,还在交易池中即还未上链
打包的过程
1、先确定哪个出块节点
2、从交易池中获取3秒这个时间段内的交易
3、将这些交易打包(如果没有交易也会进行打包)
只有打包了之后 才会确定手续费会给到哪个出块节点地址
下面咱确认下上面的表述
首先
从交易详情里面获取区块id
通过区块id查看区块详情
`./xchain-cli block eb8a60f5c12666ea0b0fbc11088d6e8f2d3466311d920a7b320b1fe642255b39
`
大家发现了没 这个区块中的交易列表中就一笔交易 就是刚才我们做的那笔
创建合约账户的交易
接着往下看这个区块详情 发现这里还有一个交易
看到了没
"txInputs": null对应的txOutputs表示出块奖励
奖励金额是 1000000 给到了节点账户 dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN
猜想:到此节点账户的金额包含2部分 一部分是 出块的奖励 另外一部分来源于手续费1000
咱们确认下上面的猜想
看到了没
当前节点账户的金额只是出块奖励的金额 并没有手续费的金额
上面的猜想错了
那么手续费的金额去哪了呢?
其实手续费的来源账户是节点账户 目标账户也是节点账户 那不就抵消了嘛
再来一个测试来印证下刚才的结论:给合约账户转账
`./xchain-cli transfer --to XC1111111111111111@xuper --amount 100000
e2979b6bff380c7e1864d645fa514e06c428bdce5e74f9bba779a36e9bf0e748
`
转账没有手续费也可以转
来源账户是节点账户 目的账户是合约账户
转账带有手续费
`./xchain-cli transfer --to XC1111111111111111@xuper --amount 100000 --fee 100
`
结论
当手续费来源账户和流向账户是同一个账户的时候 账户余额为
账户初始金额+出块高度x出块奖励-转账金额
上面的公式并没有将手续费计算在内
咱们再来一个测试来印象下
刚才不是手续费来源账户和目的账户是同一个账户嘛
那咱们测试下让手续费来源账户和目的账户是不一个账户的情况
- 先创建一个普通账户
`./xchain-cli account newkeys --output data/bob
a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
`
- 通过节点账户给这个普通账户转点钱
- 通过这个普通账户创建合约地址
- 查看交易详情
来源账户是这个普通账户a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
初始金额是刚才转给它的1000000000这么多钱
目的账户 1、手续费1000元给到了 $ 这个出块节点地址
2、剩余的999999000钱又回到了来源地址中a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
- 看下普通账户余额和节点账户余额(确认下手续费有没有转给节点账户)
`./xchain-cli account balance a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
999999000
`
余额是999999000说明手续费已经扣掉了
通过区块id查询区块详情已确认出块奖励去了哪个节点账户 (当然这里咱只用的一个节点进行测试的)
查看节点账户余额
余额是这么个值 99999999999913801000
咱计算下这个值是否符合预期
初始金额是 100000000000000000000
创建了一个合约账户手续费1000(来源账户和目的账户是一个地址 不计算在内)
给合约地址转账100000
又转账了一笔 100000 手续费100(来源账户和目的账户是一个地址 不计算在内)
创建了一个普通账户
给普通账户转账了 1000000000
普通账户创建了一个合约账户 手续费1000给到了节点账户
100000000000000000000-100000-100000+1000-1000000000=99999999998999801000
这个值是不包含出块奖励在内的值
当前的出块高度1101
99999999998999801000+1101000000=100000000000100801000
金额正好可以匹配上
通过合约账户部署合约
期望:手续费来源于合约账户,手续费给到节点账户(出块节点)
先给合约账户XC1111111111111111@xuper转账 1000000000
`./xchain-cli wasm deploy --account XC1111111111111111@xuper --cname hello_last_17 --fee 5574291 --runtime go /Users/mengfanxiao/Documents/project/company/XinPools_INFO/document/business/baidu/20200714-最新版本/xuperchain/core/contractsdk/go/example/eleccert_final/eleccert_final.wasm -a '{"creator":"mengfanxiao"}'
contract response:
The gas you cousume is: 5206429
The fee you pay is: 5574291
Tx id: f7392917ed5691ed40b3756b0b562e5dc54994052cafd7894fc21e17524b4231
`
来源账户是合约账户 XC1111111111111111@xuper
初始金额是 1000000000
最终金额 994425709
手续费是 5574291 转给了出块节点账户
查询节点账户余额为99999999999322375291
分析下这个金额是否正确
1、刚才计算的金额是 100000000000100801000
2、给合约账户XC1111111111111111@xuper转了1000000000
3、收到手续费 5574291
100000000000100801000-1000000000+5574291=99999999999106375291
100000000000100801000这个所对应的区块高度是 1101
目前高度是 1356
目前账户金额 99999999999361375291
99999999999106375291+(1356-1101)x1000000=99999999999361375291
金额完美匹配哦
通过调用合约交易
期望:账户来源是节点账户,手续费专项节点账户,即目前的余额的增加只包含出块奖励 没有手续费 ,因为手续费抵消了嘛
目前最新高度1485
最新余额 99999999999490375291
刚才计算的金额 99999999999361375291 对应的高度1356
99999999999361375291+(1485-1356)x1000000=99999999999490375291
正好对应
感谢
感谢百度链超哥的技术支持🙏
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。