美文网首页
交易是如何被创建和打包的3

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

作者: 苦逼猿猴 | 来源:发表于2018-03-08 15:54 被阅读0次

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

    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

          本文链接:https://www.haomeiwen.com/subject/jikyfftx.html