当前位置:首页 > 业界动态 > 正文

百度超级链Xuper涉及金额问题

百度链往期文章总结

在百度超级链Xuper上部署智能合约并实现证书存储功能

进一步了解百度超级链Xuper的使用

在Xuper链上部署Java语言智能合约并分析通证合约的实现逻辑

利用百度链智能合约实现公司业务场景

作为单节点环境运行

这是使用单个变量研究未知事物的合理方法。

否则,当多个变量混合在一起时,只会变得越来越混乱。

单个节点就是单个出块地址,无需考虑多个出块节点轮流出块的情况。

环境准备

cd pn1
rm -rf data/blockchain/xuper/

修改节点配置

./xchain-cli createChain
nohup ./xchain --vm ixvm &

确认接下来的几个初始金额

查看节点账户地址

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

金额为1,000,000

您可能对此金额有疑问

总金额 > 100000000000256000000 不值这个值吗?

(为什么更大?因为区块不断生成)

那为什么是1000000呢?

原因是总金额虽然 > 100000000000256000000

但它是由很多面值为1,000,000的utxo组成的

所以如果你在这里支付1,000的手续费,那么你只需要1,000,000的utxo。

有2个目标账户

1000 费用转到 $ 帐户

另外一个是999000,就是1000000的utxo减去1000的手续费,还剩这么多

您有没有想过地址是什么?

事实上,这意味着一个未知的地址

因为此时发起交易创建合约账户,同时返回交易哈希。

此时交易还没有被打包为区块的一部分,仍然在交易池中,即还没有上传到链上。

包装工艺

1.首先确定是哪个出块节点

2. 从交易池中获取3秒内的交易。

3、打包这些交易(如果没有交易则打包)

只有打包后才确定手续费分配到哪个出块节点地址。

我们来确认一下上面的说法

第一的

从交易详细信息中获取区块 ID

通过区块id查看区块详细信息

./xchain-cli block eb8a60f5c12666ea0b0fbc11088d6e8f2d3466311d920a7b320b1fe642255b39

大家发现这个区块的交易列表里只有一笔交易,就是我们刚才做的一笔。

为合约账户创建交易

然后往下看这个区块的详细信息,发现这里还有一笔交易

你看见了吗

"txInputs":null对应的txOutputs表示区块奖励

奖励金额为1,000,000,发放至节点账户dpzuVdosQrF2kmzumhVeFQZa1aYcdgFpN

猜测:该节点账户中的金额由两部分组成。 一部分是出块的奖励,另一部分来自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

初始金额是刚刚转入的10亿。

目的地账户

1. 1000元手续费给予出块节点地址$

2、剩余的999999000钱退回源地址a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9

./xchain-cli account  balance a1E2v3RHtLHhE7N4yRgcrsfsDdMsjQFm9
999999000

余额为999999000,表示已扣除手续费

通过区块ID查询区块详情,确认区块奖励到了哪个节点账户(当然我们这里只用一个节点进行测试)

查看节点账户余额

余额是这样一个值99999999999913801000

我们来计算一下这个值是否符合预期

初始金额为100000000000000000000

创建合约账户,手续费1000(源账户和目的账户为同一地址,不计算在内)

转账100000至合约地址

另转账10万,手续费100(源账户和目的账户地址相同的不计算在内)

创建了一个普通帐户

转入1000000000至普通账户

普通账户创建合约账户,1000手续费给节点账户。

100000000000000000000-100000-100000+1000-1000000000=99999999998999801000

该值不包括区块奖励。

当前区块高度为1101

99999999998999801000+1101000000=100000000000100801000

金额刚好匹配

通过合约账户部署合约

期望:手续费来自合约账户,手续费给节点账户(出块节点)

先转账1000000000至合约账户XC11111111111111111@xuper

./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

源账户为合约账户 XC11111111111111111@xuper

初始金额为1000000000

最终金额 994425709

手续费为5574291,转入超级节点账户。

查询节点账户余额为99999999999322375291

分析一下这个金额是否正确

1、刚才计算的金额为100000000000100801000

2、转入1000000000至合约账户XC11111111111111111@xuper

3、收到手续费5574291

100000000000100801000-1000000000+5574291=99999999999106375291

100000000000100801000对应的区块高度为1101

目前海拔高度 1356

往来账户金额 99999999999361375291

99999999999106375291+(1356-1101)x1000000=99999999999361375291

金额完全匹配

通过调用合约进行交易

期望:账户来源为节点账户,手续费为特殊节点账户。 即当前余额的增加只包含区块奖励,不包含手续费,因为手续费是被抵消的。

最新身高1485

最新余额 999999999999490375291

刚刚计算出来的金额是99999999999361375291对应的高度是1356

99999999999361375291+(1485-1356)x1000000=99999999999490375291

完全对应

感激的

感谢百度链朝歌的技术支持

0
0
收藏0

发表评论

最新文章

取消
扫码支持 支付码