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

被一个程序bug困扰了好久,今天终于解决了,原来是当时的一个变量写错了。

现在接着上次没有写完的东西继续写。SelectCoins();分析一下这个函数,这个函数是用来让你从自己的钱包选择可用的token的,选出后用一个变量进行存储的。先来看下函数原型:

bool SelectCoins(const CAmount& nTargetValue, std::set<std::pair<const CWalletTx,unsigned int>> &setCoinsRet, CAmount& nValueRet, const CCoinControl *coinControl = NULL, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend = true) const;

nTargetValue变量就是你要寻找的临界值,你要给接收方发送的数量。

setCoinsRet变量存储着所有的可用的交易和交易的位置

对象vCoins存储着所有的可以作用交易输出的交易信息。下面介绍AvailableCoins();函数。

默认coinControl是false,直接跳过。否则就是循环遍历进行填充,setCoinsRet.insert(make_pair(out.tx, out.i));

这个默认传入的token的类型就是ALL_COINS。所以这个也是跳过的。和上面一样,这些都是对币的选择的。

setPresetCoins存储的就是预设值。coinControl默认就是NULL;所以没有复制操作。

std::vector vPresetInputs;没有进行初始化所以里面是没有值的。所以下面的循环也没有进入。

循环遍历,如果之前存在预设值对象里面有的的话,进行删除。如果没有就跳过。

再把预设值对象含有的进行赋值给vCoins对象里面。

nValueRet对象存储着所有的你自己的可用的币的总量。这个值可能会大于你给接收方的币,最少也要等于它。

现在来看下AvailableCoins()函数。将所有的可以输出记性填充到vCoins对象里面,原型如下:

void AvailableCoins(std::vector& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl = NULL, bool fIncludeZeroValue=false, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend = false) const;

这个函数的作用是就是拿到你所有的交易里可以使用的交易输出。

先对对象进行清空操作。

然后开始对钱包里面的交易进行遍历。没找到一个交易,就对该交易进行检查。

因为钱包锁定的币的类型不一样,所以要找到可以使用的币的类型。

如果找到了,先判断是否是已花费的,是否是自己的,是否存在可以使用的金额,如果是可以使用的要存入进vCoins对象中去。

选币环节到此结束,下节介绍如何进行签名。

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

时间: 2024-10-06 00:53:34

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

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

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

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

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

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

远程服务器连接不上了,趁着这机会,继续写. CreateTransaction(vecSend, wtxNew, reservekey, nFeeRequired, nChangePosRet,strError, NULL, true, fUsePrivateSend ? ONLY_DENOMINATED : ALL_COINS, fUseInstantSend)) 上面已经对这些参数进行了分析.我们直接进入看这个函数. CAmount nFeePay = fUseInstantSend ? C

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

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

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