普通转账交易的产生

主要针对普通的转账交易。

几个大的步骤:

  1. 准备“交易”所需要的数据(输入、输出)
  2. 构建符合数据结构的“交易”(符合交易的数据结构,所有相关算法)

“交易”的数据结构,我们已经很清楚。

这里重要的环节是准备数据,然后构建符合数据结构的交易,这是下面要回答的问题:

  • 输入,主要来源于钱包,即之前已经整理出来的历史交易数据。

  • 输出,主要的是接收方地址和转账金额,加上其它一些信息。

  • 输入的个数,主要由之前的输出以及本次交易金额决定。

  • 输出的个数,由接收方地址的个数(1或N个)加上找零(0或1个)

现在输入、之前的输出、环签名成员主要通过“全局唯一索引”确定其各自身份。

Transfer

转账“指定的金额”给“指定的地址”,可批量转账。

转账指定金额
一笔交易可同时向不同地址进行转账。
// send amount to specific addresses

Outgoing_Transfer_Details 将本次转账的细节“人性化”保存在钱包客户端。
account.Mixin 检查环成员数量是否合法
dynamic_fees_per_kb 手续费费率(仅和数据大小有关)
TX_Wallet_Data
payment_id 备注的检查、规范化
address 检查格式
Get_Balance 从钱包处获得余额信息
select_outputs_for_transfer 钱包选择合适的未交易输出
load_funds_data 数据格式是 TX_Wallet_Data
Input_info 构造输入(选择环成员这块稍微复杂一点)
Output_info 构造输出(有几个地址,就有几个输出,然后加上找零)

Create_TX_v2 封装调用
后续操作,如人性化的记录交易细节 transfer_details

Transfer_Everything

转账所有金额
// send all unlocked balance amount to specific address

Create_TX_v2

专注于构建“交易”,填充其数据结构。
调用这个方法时,输入参数已经确定。
// this will create ringct simple 2 transaction to transfer x amount
func (w *Wallet) Create_TX_v2(inputs []ringct.Input_info, outputs []ringct.Output_info, fees uint64, unlock_time uint64, payment_id []byte, bulletproof bool) (txout *transaction.Transaction)

交易基本数据
Vin
Extra
Vout
签名基础数据
BulletSigs
OutPk
ECdhInfo
pseudoOuts
MlsagSigs
MixRing

输入参数,主要是 inputs[] 和 outputs[] 加上一些其它信息,输出参数是一个符合数据结构的“交易”。

  • 元数据
  • 输入
  • 额外数据
  • 输出
  • 签名

钱包,要做的一些事:

w.account.Mixin // 混合个数
w.dynamic_fees_per_kb // 手续费
w.Get_Balance // 余额
w.select_outputs_for_transfer // 之前的输出,现在的输入(N条数据)
w.load_funds_data // 之前的输出,现在的输入(单条数据的具体信息)
w.load_ring_member // 环成员
w.account.Keys // 找零时的公钥,组成地址
w.Get_Height // 链信息
w.Create_TX_v2 // 构建交易
w.getfees // 手续费
w.GetTXKey // 交易信息
w.store_key_value // 存储交易信息

普通转账交易细节

transfer_details 钱包记录本次转账细节

mixin 参与环混合数目

dynamic_fees_per_kb 手续费

addr,amount 可以批量转账,批量转账时地址和金额要成对出现

payment_id 校验、格式化

addr 地址基本校验

Get_Balance 从钱包处获得余额信息

select_outputs_for_transfer 钱包选择合适的 UTXO(主要根据金额判断)

load_funds_data 当前输入金额信息 (格式 Input_info)

load_ring_member 为当前输入添加环成员(要做判断 Is_Input_Mature)

outputs 构造输出(格式 Output_info)

change 构造找零(格式 Output_info,它也属于输出)

交给:

Create_TX_v2

进一步处理本次交易的输入(设置 KeyImage 和 offset

处理本次交易的额外字段

进一步处理本次交易的输出(设置一次性地址

交给(环签名):

Gen_RingCT_Simple_BulletProof

Gen_RingCT_Simple

基本数据填充

进一步处理交易的输出:范围证明,输出见证、加密交易金额

进一步处理交易的输入:输入见证

环签名

results matching ""

    No results matching ""