比特币交易

UTXO - Unspent TransXtion Output

        未花费交易输出: 用公钥锁定(加密)一个数字

        比特币系统里没有比特币概念,只有UTXO

        比特币系统里没有账号概念,只有公钥锁定的UTXO

        比特币系统里没有账户余额概念,只有UTXO

        UTXO存在全节点的数据库里

        转账将消耗点属于你自己的UTXO,同时生成新的UTXO,并用接受者的公钥锁定

交易包括两个部分:n输入和m输出 (n>=0,m>0)

        输入: 要被花费的UTXO +解锁脚本

        输出: UTXO + 锁定脚本

交易的结构

        交易的输出:锁定的比特币数量  和 锁定脚本            

        交易的输入:解锁脚本

比特币交易_第1张图片
UTXO记录删与加

        交易的确认: 只有进入到区块的交易才算确认

比特币交易_第2张图片
交易在区块中确认

交易验证脚本语言 - 基于栈的脚本语言

        栈(stack) - 操作数据的一种结构

                只能做一段操作数据,后进 先出(last in First Out)

                压栈(PUSH) 出栈(POP)

逆波兰表示法

    所有的操作运算符都位于操作数后面

    遇到操作数字, 则压栈 PUSH

    遇到运算符   (+,-,*,/):

        先将2个操作数字出栈POP

        然后用后面的运算符对两个数字计算

        然后在将计算结果压栈PUSH

    一般标识法:(1+2) * 3 == 9 ?

    逆波兰表示法:1 2 + 3 * 9 == ?


交易验证

        锁定脚本

                OP_DUP OP_HASH160<发送者 公钥哈希> OP_EQUALVERIFY OP_CHECKSIG

        解锁脚本

                <发送者签名><发送者公钥>

        交易验证: 运行解锁脚本 + 锁定脚本 => True


比特币交易_第3张图片


比特币交易_第4张图片


比特币交易_第5张图片


比特币交易_第6张图片

        验证主要:

            交易的大小要小于区块大小的上限

            交易输入的UTXO是存在的

            交易输入UTXO没有被其他的交易引用-防止双花(double spending)

            输入总金额 > 输出总金额

            解锁脚本验证

        将合格的交易加入到本地的transaction 数据库中,并将合法的交易转给临近的节点

你可能感兴趣的:(比特币交易)