远程服务器连接不上了,趁着这机会,继续写。
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.继续上面步骤重复操作。知道满足为止。
到此创建交易分析完毕。
原文地址:https://www.cnblogs.com/AlfredZKY/p/9931832.html