交易是如何被创建和打包的3

Posted alfredzky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交易是如何被创建和打包的3相关的知识,希望对你有一定的参考价值。

远程服务器连接不上了,趁着这机会,继续写。

CreateTransaction(vecSend, wtxNew, reservekey, nFeeRequired, nChangePosRet,strError, NULL, true, fUsePrivateSend ? ONLY_DENOMINATED : ALL_COINS, fUseInstantSend))

上面已经对这些参数进行了分析。我们直接进入看这个函数。

CAmount nFeePay = fUseInstantSend ? CTxLockRequest().GetMinFee() : 0;//特有的即时交易的设置标志,默认是false

技术分享图片
 

对向量对象vecSend进行遍历操作,计算出要发送给对方的token总和。

技术分享图片
 

交易事务对象和钱包进行绑定。

txNew.nLockTime = chainActive.Height();// 交易的锁定时间戳和当前区块高度有关。

技术分享图片
 

这两个断言证明交易的时间戳和区块的高端和关系,以及它的阈值范围,在源码transaction.h文件中看。

上面关于接受人和时间戳赋值完毕之后,就要对钱包里面的utxo进行遍历以获取到足够的金额来填充vin(交易输入)

技术分享图片
 

进行while死循环来组建交易所需要的变量值,切记一次有可能不会成功的。当交易费充足的时候就会break出死循环。

先对交易对象txNew中的vin和vout进行清空。然后遍历接收人向量vecSend中关于接收人的数据,组成vout(交易输出)

最后对vout进行是不是灰尘交易费的判断,vout必须是未花费状态的。最后就是交易对象的栈中存储,这样用于接收方的vout就创建好了。

技术分享图片
 

选择钱包里面可以使用的币。ps:就是到钱包里面去找,成熟的,可以使用的币。SelectCoins();下次分析。

技术分享图片
 

对扫描出来的币进行币龄的计算。越早的币,币龄越久。

const CAmount nChange = nValueIn - nValueToSelect;这一步很关键,如果这个nChange大于就必须要有找零。否则返回就是币刚好,没有找零了。

技术分享图片
 

基本上和步骤就是

1.调用预置类对象拿到一个公钥

2.由公钥拿到公钥哈希也就是地址。

3.由地址构建锁定脚本

newTxOut = CTxOut(nChange, scriptChange);由构造函数进行vout的构造创建

这样找零的锁定脚本也构造完毕了。

剩下判断是否是灰尘的就说了。

 

技术分享图片
 

这样由上面的选币环节,我们就可以知道哪些时刻用的交易输出。然后就用它们填充进vin.vin填充完毕后要把vin对象赋值给交易对象txNew的vin。

技术分享图片
 

这一段是对你之前选好的交易输入进行签名认证,即证明这钱是你的。不是别人的。关于是如何签名的,下节介绍。这个创建交易的函数很长一定要写完。

技术分享图片
 

验证过了之后,要对交易进行序列化,判断交易的大小。

技术分享图片
 

交易序列化后大小满足之后,然后是交易的设置,不允许发送没有交易费的交易。

技术分享图片
 

交易费满足了,直接break,否则就是continue.继续上面步骤重复操作。知道满足为止。

到此创建交易分析完毕。













以上是关于交易是如何被创建和打包的3的主要内容,如果未能解决你的问题,请参考以下文章

交易是如何被创建和打包的1

交易是如何被创建和打包的7

交易是如何被创建和打包的2

交易是如何被创建和打包的4

交易是如何被创建和打包的6

区块链 以太坊 gaslimit 区块大小