区块链基础一

Posted by Alex Kinhoom on July 3, 2018

区块链的概念

区块链最早诞生于比特币,是实现比特币的底层技术,衍生出区块链的概念。经过7年的发展,区块链由最初的衍生概念发展成为了不再依附于比特币的一种革命性的技术,而比特币成为了区块链概念中最成功的一款”应用”。

区块链的定义

技术层面 区块链是一个基于共识机制去中心化的公开数据库。通俗理解就是区块链由许多对等的节点组成,通过共识算法保证区块数据和交易数据的一致性,从而形成一个统一的分布式账本
价值层面 区块链是一个价值互联网,用于传递价值。目前的互联网还是用来传递信息。比特币实现了互联网的价值层面的传播。未来互联网的发展倾向于信息的传播以及价值创造。
维基百科 维基百科上定义的较为冗长,一个区块链是一个基于比特币协议的不需要许可的分布式数据库,它维护了一个持续增长不可篡改的数据记录列表。简言之,区块链就是区块用某种方式组织起来的链条

区块链四大的特点

Distributed 分布式
Autonomous 全自动
Contractual 合约执行式
Trackable 可追溯的

交易和交易链

交易签过名的数据结构,该数据结构会在区块链网络中广播。并被收集到区块中。它会引用以前的交易,从该交易中发送特定数量的比特币到一个或多个公钥公钥即比特币地址,交易是不加密的。 区块链>区块>交易链>交易

比特币的地址

比特币地址是由数字字母组成的字符串。可以形象的将其理解为收款人。可以与任何想给你比特币的人分享。由公钥 同样由数字和字母组成的字符串生成的比特币地址以数字1开头。

  • 地址的生成 比特币地址是由公钥经过单向的hash函数生成的。用户所通常见到的比特币地址是经过Base58Check编码的。这种编码使用了58个字符一种Base58数字系统和校验码。提高了可读性,避免了歧义,并有效的防止了地址转录和输入中产生的错误。编码也被用于比特币的其他地方。例如私钥,密钥和脚本hash中。用来提升可读性和录入的正确性。

    交易的本质

    交易本质上就是包含一组输入列表和输出列表的数据结构。也可称之为转账记录。其中包括了交易金额,来源和收款人等信息。具体结构如下。 数据项 | 描述 | 大小

  • 版本号 目前为1 4字节
    输入数量 正整数VI=VarInt 1 ~ 9 字节
    输入列表 每块的第一个交易的第一个输入成为 “coinbase” -许多输入
    输出数量 正整数VI=VarInt 1 ~ 9 字节
    输出列表 块中的第一个交易的输出是花掉挖矿得到的比特币 -许多输出
    锁定时间 lock_time 如果非0并且序列号小于0*FFFFFFFF,则是指块序号;如果交易终结,则是指时间戳 4字节

比特币交易的具体例子

Input:
Previous tx:f5***a6
Index:0
scriptSig:3045***01

Output:
Value: 5000000000
scriptPubKey:OP_DUP OP_HASH160 40***9d
OP_EQUALVERIFY OP_CHECKSIG

上文表示,交易A的输入0从交易f5***a6的0号输出中导入了50个比特币。然后该输出发送50个比特币到一个比特币地址的公钥hash40***9d,该公钥hash是16进制表示,而非正常的base58表示。 如果创建者想要花掉这笔钱,那么他首先得创建自己的交易B,再引用该交易A0号输出作为交易B的输入。

输入和输出

比特币交易解码后的内容

{    
      "version": 1,    
      "locktime": 0,    
      #交易输入(input)部分
      "vin": [           
        {    
          #输入引用的交易(transaction)HASH
          "txid": "79***f18",       
          
          #引用交易中的UTXO索引(第一个为0,此处代表上述txid交易中的第一个UTXO)
          "vout": 0,                                    
          
          #解锁脚本,用于解锁UTXO的脚本(这是可以花费这笔UTXO的关键信息)
          "scriptSig": "30***52adf",          
          "sequence": 42***95            
        }    
      ],    
      #交易输出(output)部分 
      "vout": [         
        {    
          #第一个输出的比特币数量
          "value": 0.01500000,             
          #锁定脚本,后续的交易如要使用该输出,必须解锁锁定脚本
          "scriptPubKey": "OP_DUP OP_HASH160 ab6***e7 OP_EQUALVERIFY OP_CHECKSIG"          
        },    
        {    
          #第二个输出的比特币数量
          "value": 0.08450000,             
          "scriptPubKey": "OP_DUP OP_HASH160 7f9b***25a8 OP_EQUALVERIFY OP_CHECKSIG",    
        }    
      ]    
    }

可以从以上内容看出,比特币的交易中实际没有账户余额信息,只有输入(input)与输出(output)两部分信息。
说的更直白一点,比特币的交易类似于现实世界中直接用支票进行交易。如A写给B一张100元的支票,其中A是输入,B是输出。当B需要给C50元时,B不是去银行兑现支票然后付款给C,而是直接写两张新支票,一张50元给C,一张50元给自己,再将原来100元的支票作废,即完成一次非基于账户模型的支付。