# 交易
# 介绍
区块链由一组不可变且通过加密链接的交易构成。每一个交易包含一到多个输入,以及一到多个输出。一个输入既可发行一种新的资产单元,也可将先前一笔交易输出中已存在的资产单元作为转账的来源。输出从输入中获取资产单元并定义它们的分配方式。单个输出包含一笔资产数额以及对应的控制程序来指定在未来如何被花费。或者一个输出可以销毁资产单元,将它们从流通中移除。
一笔交易可以有多个输入和输出,且包含许多不同类型资产,不同来源以及不同的目的地。一笔交易中的所有动作(发行、花费、接收以及销毁资产)将会作为单个原子操作同时发生,不会存在一个时间点只有部分被执行。
在一笔交易中,输入的资产总数必须等于输出的资产总数。为了创建新的资产单元,我们在一个输入中发行资产并用一到多个输出来接收;为了转移资产单元,我们在一个输入中将其花费并用一到多个输出中来接收;为了销毁资产单元,我们在输入中将其花费并在一个输出中进行销毁。
# 消费一个完整的未花费输出
当创建一个输入时,即从一个较早交易的输出中花费一定数额的资产,该输出中所有数目的资产都必须被完全花费掉。如果你不想转移所有的资产到你的目的接受者中,则需要返还到自己的账户中,这种方式称之为找零。因此,从一个输入中花费一笔资产经常需要提供两个输出。其中一个作为目的输出,另一个输出用来返还剩余的资产。一般来说,比原会自动为你管理找零输出。
# 合并未花费的输出
一些支付可能需要很多的资产单元,其数额超过任何一个未花费输出的大小。当从账户中进行一笔消费时,只要账户中存在足够的资产,比原将会自动选择未花费输出来满足本次支付。
# 创建交易
创建一笔交易总共包含三个步骤:
- 构建交易: 用来定义交易需要做什么,是为了发行一笔资产还是从账户中花费资产,或者使用另一个账户接收资产。
- 签名交易: 使用私钥授权资产支出或者发行新的资产单元。
- 提交交易: 提交一个完整的、签名交易到区块链上,并且传播到主网的其他节点上。
# 构建交易
在比原中,并不强制你直接操作输入和输出,而是通过下面列出的几种高层次的actions来构建交易。 目前总共有六种类型的actions:
action | 描述 |
---|---|
issue | 发行一种新的资产单元 |
spend_account | 从一个指定的账户中花费指定的资产单元,比原将自动从未花费输出中找到足够的资产单元,并创建找零输出 |
spend_account_unspent_output | 从一个账户中指定一个完整的未花费输出,找零需要通过其他actions手动处理 |
control_address | 接收一笔资产单元,接收方式为地址模式 |
control_program | 接收一笔资产单元,接收方式为合约模式 |
retire | 销毁指定的资产单元 |
# 签名交易
为了让一笔交易被区块链接收,它的输入必须包含有效的签名。对于资产发行输入,签名必须与资产发行程序中的公钥相对应;对于花费(spending)输入,签名必须与所花费输出中控制程序的公钥相对应。 交易签名为区块链提供了安全性,加密技术可以防止每个人在没有相关私钥的情况下生成有效的交易签名。
# 提交交易
一旦交易的输入输出是平衡的并且所有输入被签名过,它就被认为是有效的且可以被提交到区块链上。本地节点率先将交易添加到区块链,并广播到主网的其他节点上。