普通转账交易的产生
主要针对普通的转账交易。
几个大的步骤:
- 准备“交易”所需要的数据(输入、输出)
- 构建符合数据结构的“交易”(符合交易的数据结构,所有相关算法)
“交易”的数据结构,我们已经很清楚。
这里重要的环节是准备数据,然后构建符合数据结构的交易,这是下面要回答的问题:
输入,主要来源于钱包,即之前已经整理出来的历史交易数据。
输出,主要的是接收方地址和转账金额,加上其它一些信息。
输入的个数,主要由之前的输出以及本次交易金额决定。
输出的个数,由接收方地址的个数(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
基本数据填充
进一步处理交易的输出:范围证明,输出见证、加密交易金额
进一步处理交易的输入:输入见证
环签名