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

趁着这时候同事还在给我准备测试数据,有点富余时间就先把第二篇章给写。开整

书接上文SendMoney(address.Get(), nAmount, fSubtractFeeFromAmount, wtx, fUseInstantSend, fUsePrivateSend);

参数都介绍过了,可以参照第一篇。

截图不太好,大家可以自己去看下源码。

CAmount curBalance = pwalletMain->GetBalance();//这个首先拿到钱包的余额。

if (nValue <= 0)

throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid amount");

if (nValue > curBalance)

throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Insufficient funds"); //nValue就是你要给要别人发送的token,这里对它进行判断,小于0的会报无效的数量,如果大于钱包的余额,则会报出金额不足,不足以支付此次支出。

对金额检查完毕后

// Parse Dash address

CScript scriptPubKey = GetScriptForDestination(address); // 有注释可知对你要发token的地址进行解析,解析成了脚本。

// Create and send the transaction      //由注释可以看到这是创建和发送事务

CReserveKey reservekey(pwalletMain); // 从秘钥池申请一个私钥。大家可以去看下这个类

CAmount nFeeRequired;                             // 这个变量就是用于本次交易的交易费

std::string strError;                                         // 用于接收交易创建错误信息

vector <CRecipient>vecSend;                 // 一个向量,里面存储的元素是CRecipient 。CRecipient是一个结构体

int nChangePosRet = -1;                              // 默认设置为-1 创建交易的函数里面会解释,这里先过去。

CRecipient recipient = {scriptPubKey, nValue, fSubtractFeeFromAmount};// 对结构体对象recipient  进行初始化。

我们来看下 CRecipient 结构体,这个存储着接收方的信息。

struct CRecipient

{

CScript scriptPubKey;                                // 用于创建接收方的公钥脚本

CAmount nAmount;                                    // 接收token金额

bool fSubtractFeeFromAmount;               // 交易费的递减金额 标志

};

从上文我们看到,这个标志默认传入是false。

vecSend.push_back(recipient);// 把创建好的接收方信息,推入栈中,注意从可以看出是可以存在多个接收方的。创建好之后,推入栈中就可以了。

自此所有的准备工作,已经准备完毕。

if (!pwalletMain->CreateTransaction(vecSend, wtxNew, reservekey, nFeeRequired, nChangePosRet,

strError, NULL, true, fUsePrivateSend ? ONLY_DENOMINATED : ALL_COINS, fUseInstantSend)) {

if (!fSubtractFeeFromAmount && nValue + nFeeRequired > pwalletMain->GetBalance())

strError = strprintf("Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!", FormatMoney(nFeeRequired));

throw JSONRPCError(RPC_WALLET_ERROR, strError);

}

if (!pwalletMain->CommitTransaction(wtxNew, reservekey, fUseInstantSend ? NetMsgType::TXLOCKREQUEST : NetMsgType::TX))

throw JSONRPCError(RPC_WALLET_ERROR, "Error: The transaction was rejected! This might happen if some of the coins in

不好意思啊,这个屏幕真的是,报错信息我就不粘全了,大家自己去看下,也不是太重要。

最核心的函数就来。CreateTransaction(vecSend, wtxNew, reservekey, nFeeRequired, nChangePosRet,strError, NULL, true, fUsePrivateSend ? ONLY_DENOMINATED : ALL_COINS, fUseInstantSend))创建事务的也就是交易的函数。这里对参数作用简要介绍下。上文介绍过的,就不在介绍了 。

vecSend:用于存储接收方的信息的向量对象。

wtxNew:这次本次创建交易的对象,存储交易的信息

nChangePosRet:一个位置默认是-1

NULL:                    币的控制。原型 const CCoinControl *coinControl = NULL。

true                            是否签名。原型 bool sign = true。

报错信息很好理解,再次就不解释了。

CommitTransaction(wtxNew, reservekey, fUseInstantSend ? NetMsgType::TXLOCKREQUEST : NetMsgType::TX)

这个也算是核心函数对创建的交易记性提交。对交易创建函数解析完毕之后。咱对它进行解析。

好了,今天就到此吧。

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

时间: 2024-10-05 23:25:43

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

交易是如何被创建和打包的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

交易是如何被创建和打包的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