区块链记账原理
区块链记账原理
区块链(1.0)是一个基于密码学安全的分布式账本,是一个方便验证,不可篡改的账本。通常认为与智能合约相结合的区块链为区块链2.0, 如以太坊是典型的区块链2.0,很多人只了解过比特币,不知道区块链。
本文将讲解区块链1.0技术是如何实现的。
哈希函数
在讲区块链记账之前,先说明一下哈希函数。
哈希函数:Hash(原始信息) = 摘要信息
原始信息可以是任意的信息, hash之后会得到一个简短的摘要信息
哈希函数有几个特点:
- 同样的原始信息用同一个哈希函数总能得到相同的摘要信息
- 原始信息任何微小的变化都会哈希出面目全非的摘要信息
- 从摘要信息无法逆向推算出原始信息
eg:
- Hash(张三借给李四100万,利息1%,1年后还本息 …..)[^原始信息] =
AC4635D34DEF
[^摘要信息]
账本上记录了AC4635D34DEF这样一条记录。
哈希函数有4个作用:
- 简化信息--- 有的时候交易信息很长,文字很多,哈希后信息可以大大缩短
- 标识信息--- 可以使用AC4635D34DEF来标识原始信息,摘要信息也称为原始信息的id
- 隐匿信息--- 账本是AC4635D34DEF这样一条记录,原始信息别人无法知道具体事物
- 验证信息--- 因为摘要信息(哈希后的字符)与原始信息存在唯一性,所以摘要信息可作为验证原始信息的唯一依据,如李四在还款时欺骗说,张三只借给李四10万,双方可以用AC4635D34DEF来验证原始信息,很显然原始信息中的任意一点微小变化,造成的摘要信息都会改变!
区块链记账方法
假设有一个账页序号为0
的账页交易记录
如下:
账号 | 入账 | 出账 | 余额 | 备注说明 |
---|---|---|---|---|
王二 | 100 | 190 | 收到xxx货款 | |
张三 | 100 | 30 | xxxx | |
李四 | 120 | 90 | 170 | xxxx |
记账时间为:2018-4-16 10:22:02
区块链在记账时会把账页信息(包含序号、记账时间、交易记录)作为原始信息进行Hash, 得到一个Hash值,如:787635ACD, 用函数表示为:
Hash(序号0、记账时间、交易记录) = 787635ACD
账页信息(原始信息)和Hash值(摘要信息)组合在一起就构成了第一个区块。
区块定义
账页信息(原始信息)+ 787635ACD(哈希值) = 区块
块结构
-
下面是一个块结构
block = { 'index': 1, 'timestamp': 1506057125.900785, 'transactions': [ { 'sender': "8527147fe1f5426f9dd545de4b27ee00", 'recipient': "a77f5cdfa2934df3954a5c7c7da5df1f", 'amount': 5, } ], 'proof': 324984774000, 'previous_hash': "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" }
-
contains:
1.索引(index)
2.Unix时间戳(timestamp)
3.交易列表transactions
4.工作量证明(proof)
5.前一个区块的hash值(previous_hash)
比特币系统里约10分钟记一次账,即每个区块生成时间大概间隔10分钟
在记第2个账页的时候,会把上一个块的Hash值[^上一块的摘要信息]和当前的账页信息一起作为原始信息进行Hash,即:
Hash(上一个Hash值(摘要信息)、序号1、记账时间、交易记录) = 456635BCD
这样第2个区块不仅包含了本账页信息,还间接的包含了第一个区块的信息。依次按照此方法继续记账,则最新的区块总是间接包含了所有之前的账页信息。
区块链定义
所有这些区块
组合起来就形成了区块链
。这样的区块链就构成了一个便于验证(只要验证最后一个区块的Hash值就相当于验证了整个账本
),不可更改(任何一个交易信息的更改,会让所有之后的区块的Hash值发生变化,这样在验证时就无法通过)的总账本。