交易是如何被创建和打包的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.继续上面步骤重复操作。知道满足为止。

到此创建交易分析完毕。

原文地址:https://www.cnblogs.com/AlfredZKY/p/9931832.html

时间: 2024-10-05 03:09:31

交易是如何被创建和打包的3的相关文章

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

上节介绍完交易是如何钱包里面进行选币的,这次我们来看下如何对交易进行签名.这节可能会长,这次尽量写完. 接着上文我们知道,一笔交易的创建是需要进行vin的填充和vout的构造的.当我们操作完毕后,我要对自己的交易里面的交易输入进行签名操作,以证明该交易输入填充进的交易输出是你的,你具有支配权. 循环遍历交易对象里面的所有的vin,并对其进行签名操作.nIn变量,表示你由几个交易输入的索引.从这里就这个看到,你需要填充该笔交易的交易输入有几个. 从之前的讲解我们知道,交易的构建.这里不再赘述. 这

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

今天介绍下交易创建构建完毕后,是如何提交的,为何要提交交易?提交到哪里? wtxNew就是已经构建好的交易对象,不懂的可以参照CreateTransaction()函数,reserverkey对象,是一个从密钥池中预值,通过它可以从预值的密钥池中取出一个公钥.接着看主体. 首先是一个互斥锁,无论何种条件下,钱包只能被一个进程或者线程访问,保证钱包里面的数据是唯一的.然后是一个日志的打印,把自己创建好的交易进行一个打印输出,具体格式可以参照ToString(),这个函数就是把交易对象里面的数据以字

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

趁着这时候同事还在给我准备测试数据,有点富余时间就先把第二篇章给写.开整 书接上文SendMoney(address.Get(), nAmount, fSubtractFeeFromAmount, wtx, fUseInstantSend, fUsePrivateSend); 参数都介绍过了,可以参照第一篇. 截图不太好,大家可以自己去看下源码. CAmount curBalance = pwalletMain->GetBalance();//这个首先拿到钱包的余额. if (nValue <

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

被一个程序bug困扰了好久,今天终于解决了,原来是当时的一个变量写错了. 现在接着上次没有写完的东西继续写.SelectCoins();分析一下这个函数,这个函数是用来让你从自己的钱包选择可用的token的,选出后用一个变量进行存储的.先来看下函数原型: bool SelectCoins(const CAmount& nTargetValue, std::set<std::pair<const CWalletTx,unsigned int>> &setCoinsRe

MAVEN创建并打包web项目

maven项目是由一个maven project和多个maven module组成的,下面简单介绍一下maven webapp的创建和打包,前提是你已经安装配置好maven了. 打开eclipse,按照如下操作: 我们首先当然要先创建一个project,如上图选择. 现在maven project已经创建好了,project的名称是test,并且自动创建了一个pom.xml配置文件,这是一个灵魂性的配置文件,以后还会详细介绍.下一步我们创建一个maven module. 注意下面步骤,此步不需要

android命令行创建并打包项目

命令行创建Android项目 查看sdk信息 将目录更改到 Android SDK 的tools/的路径. 执行: android list targets 这将打印您已经为您的 SDK 下载可用的 Android平台的列表.查找您要对其编译使您应用程序的平台的目标 id 的便笺.我们建议您选择可能的最高版本.您仍可以生成您的应用程序支持较旧的版本,但将生成目标设置为最新版本允许您优化您的应用程序的最新设备. 创建项目 命令 android create project --target <ta

weexpack 创建项目, 打包Android 和 ios

1: 首先确保 node.js版本大于6.0, 不然使用 weexpack 时会报错(部分使用es6语言,node版本太低不支持es6) 下面所有都是命令行执行的命令 2: 全局安装 weexpack npm install weexpack -g 3: 生成weex项目 weexpack create 项目名字 注意: 创建的工程默认不包含 ios 和 android 工程模版 4: 进入项目根目录安装依赖 npm install 此时如果你有其他的weex项目, 可以正常web上跑的, 你可

创建自己的library类库包并使用webpack4.x打包发布到npm

我们在开发过程中,可能经常要使用第三方类库,比如jquery.lodash等.我们通过npm,下载安装完之后,就可以使用了,简单方便.我们自己可以创建一个类库,然后供其他人这样安装使用吗?当然是可以的. 下面我们就来说说. 1. 创建自己的类库 index.js import numRef from './ref.json' const numberWord = () => { const numToWord = (num) => { let returnValue = _.reduce(nu

从0到1简易区块链开发手册V0.4-实现转账交易的思路分析

六.转账交易 创世区块创建完毕之后,按照我们的正常思路,是继续创建新的区块,并加入至区块链中,没错,这确实是学习路线,但是我们首先来了解一个区块是如何生成的,转账交易 ===>打包交易 ===>工作量证明 ===>生成区块 在上文,我们提到了钱包地址这个概念,我们一般可以简单将钱包地址理解为一个银行账户,那么交易也就可以理解为是地址与地址之间的转账过程. 因为这部分内容非常重要,设置可以说交易就是比特币原理的核心,所以,为了保证大家对概念有充分的了解,本章节的理论描述部分此处摘录liuc