zoukankan      html  css  js  c++  java
  • 比特币交易过程

    1、钱包

    钱包可以包含多个地址,地址类似于银行卡号,然后有私钥。

    私钥产生公钥,公钥产生地址。

    私钥是由种子随机数生成,现在有助记词,也可以用于推导私钥。私钥 = 助记词。

    由于私钥64位,长得太难看,没有可读性,而私钥的备份在电脑上复制起来容易,手抄下来就比较麻烦,但私钥保存在联网的电脑上毕竟不安全,有被其他人看到的风险,于是有了助记词工具,利用某种算法可以将64位私钥转换成十多个常见的英文单词,这些单词都来源于一个固定词库,根据一定算法得来。

    钱包的功能:1、保存私钥、地址;2、接入比特币网络,用于发送和接收交易。

    没有余额、账号概念,就是UTXO,比特币的记录就是UTXO的记录,常说的余额就是统计地址的所有UTXO输入减去UTXO输出。

    2、交易生成

    一笔交易信息的形成有输入和输出,输入是UTXO、解锁脚本(包含付款人对本次交易的签名(<sig>)和付款人公钥(<PubK(A)>))、UTXO序号(来源的),输出是发送数量、锁定脚本、UTXO序号(生成的)。其实交易的原理,就是使用原有的UTXO生成新的UTXO,所以输入输出都有UTXO序号,别搞混。然后脚本,有解锁脚本和锁定脚本,通常把解锁脚本和锁定脚本串联起来,才能用于验证交易的可行性。

    交易的验证目的有两个:1、输入的UTXO确实是付款人的;2、交易信息没有被篡改过。

    交易的验证方法是脚本的操作,脚本其实是数据和操作符,通过简单的出栈、入栈,最后是否达到true。例如常见的脚本如下:

    锁定脚本:<sig><PubK(B)>

    解锁脚本:OP_DUP、OP_HASH160、<PubKHash(B)>、OP_EQUALVERIFY、OP_CHECKSIG

    OP_ 开头的表示操作符,<> 中间的内容表示数据,<> 表示入栈

    OP_DUP、OP_HASH160、<PubKHash(B)>、OP_EQUALVERIFY 这几步是验证这笔UTXO确实是付款人的,OP_CHECKSIG 这一步是验证 <sig><PubK(B)> 是否成立,即通过付款人的公钥对签名信息进行解密,是否等于原文信息,保证原文信息没被篡改过。

    输入和输出可以有多个,简单来说:输入=要花费的UTXO+解锁脚本,输出=UTXO(币的数量+锁定脚本)

    3、交易接收

    节点验证交易时有以下几步,验证通过后放入本地的Transaction数据库,并广播给相邻节点,不通过则丢弃:

    (1)交易的size要小于区块的size的上限

    (2)交易输入UTXO是存在的

    (3)交易输入UTXO没有被其它交易引用-防止双花(Double Spending)

    (4)输入总金额>输出总金额(多出来的钱是给旷工的小费)

    (5)解锁脚本验证成功

    4、挖矿

    节点会并发进行两个操作:1、打包区块,搜索nonce值,使区块验证成功;2、监听其他节点的验证,监听到并验证成功后停止自己的搜索,启动下一个生成区块任务。

    交易池会把已经打包进区块的交易丢掉。

    节点可以过滤交易手续费低的交易,不打包进区块。

    生成区块后,会有coinbase的挖矿奖励。

    5、确认

    通常达到6次后,这笔交易才有效。

    因为区块链就是一环扣一环,该区块包含父区块的信息哈希值和自己的时间戳,除非把之前的区块打到重来,不然拒绝篡改。

  • 相关阅读:
    Angularjs html文本显示
    .net与.net core学习目录
    数据库学习目录
    WCF学习目录
    sql学习目录
    EF学习目录
    git for Windows
    图谱论(Spectral Graph Theory)基础
    2017机器学习相关会议时间
    数值分析教材统计
  • 原文地址:https://www.cnblogs.com/linguoguo/p/10413655.html
Copyright © 2011-2022 走看看