区块链基本原理

发布时间 2023-03-22 22:53:34作者: llcl

要解决的难题

1)账本不能被篡改 : 分布式账本,一个坏人要修改,需要经过其他好人的同意

2)账本不能丢失损坏: 多个人记账,分布式账本

3)证明你是你: 匿名,数字签名。 可以由多个账户。

4)同一份钱不能花2次以上。双花攻击:设计一个强时序性的数据结构。若干交易打包成一个块block。 俩笔交易在同一个块打包时会被校验出不合法。 只能有一个被打包到块。系统再收到交易就会余额不足(非法交易)。

chain of blocks .只是一种数据结构。

哈希:不同的输入x得到固定长度的y.(256bit)

区块哈希的输入: 区块编号、数据(多条交易信息)、前一区块的hash值、nonce(随机数)、

这样在一个已知的区块的情况下,可以一直追溯到第一个区块。

有人篡改交易信息。hash值就会发生变化,影响整个链表。

hash函数3个特性

1) 防碰撞:不同的输入x, 一定要产生不同的值y. 碰撞可能存在,可以忽略。
2) 信息隐藏: 很难通过y来计算出x. 保证用户的隐私与安全

3)易出难题, 容易验证,但是计算出满足一定的哈希值很难。

P2P网络

peer to peer 分布式
有新交易产生,节点向自己的所有相邻节点发送交易广播。 直至全网都收到交易信息。
比特币网络节点按功能分为4个功能模块
1)Wallet: 钱包 :签名交易与账户余额管理
2)Miner: 矿工 :挖矿 (计算满足一定条件的哈希值)
3)Full Blockchain: 全节点 :保留全部区块链的数据
4)Network: 路由节点 :提供网络路由服务,让新加入的节点能够找到它的邻居

PoW共识算法

Proof of Work 工作量证明
只要看到结果,就知道你为此付出了大量的工作。

分布式节点为啥要共同维护账本。为啥要加入到网络中,靠激励机制。
就是交易数据要计算哈希值。不是随便计算出一个,这就有难度和工作量了。根据随机数的变化,找到哈希值前面记为都为0.
一旦得到了hash值。验证只需要一次。
平均十分钟左右产生一个区块。
开始每一个块奖励50个比特币,每四年减半。最终全部挖出来是2100万个。 全部挖完咋办, 交易有手续费,矿工始终有动力去挖矿。
十分钟一个区块,四年大概21万个。
100 = 50+25+6.25+3.125+1.5625+….依此类推)
100 * 21万 = 2100万个

UTXO模型

image

比特币的账户模型,和传统的余额模型不一样。不存在账户,只有地址。
账户:私钥 (账户管理权)公钥(私钥加密产生的,不可逆) 比特币地址(公钥经过俩次hash得到的一个字符串,保护了公钥的信息)
一个人的比特币余额就是看 地址里还有多少比特币,计算这个比特币数量的方式或数据结构叫UTXO Unspent Transaction Output(未花费的交易输出)

四笔交易如下:
1: Inputs:
Outputs: 25.0 -> Alice
2:Inputs: 1[0]
Outputs: 17.0 -> Bob, 8.0-> Alice
3: Inputs: 2[0]
Outputs: 8.0 -> Carol, 9.0 -> Bob
4: Inputs: 2[1]
Outputs: 6.0 -> David, 2.0 -> Alice

没有Inputs代表系统奖励。

1[0]代表第一笔交易的第一个输出。
2[1]代表第二笔交易的第二个输出
某个UTXO只要被引用就会失效。实现了交易的原子性。

DApp

去中心化分布式应用 Decentralized Application
不受公司运营的限制,不依赖某个独立的服务器。

因为区块链的存储消耗太大,不可能将所有的数据都保存到区块链中,目前DApp大多是去中心化和中心化相结合。

公链与联盟链

公链:比特币、以太坊、EOS,需要对矿工进行激励,不限制节点的加入
联盟链:小型团体组件的私有网络。联盟确立的时候,职责已经明确,没有激励机制,有准入机制。

区块链挖矿演示

https://andersbrownworth.com/blockchain

image

智能合约

区块链最核心的功能就是存储功能(记账),是一种特殊的数据库,想要在区块链这样的数据库上进行应用开发,就需要找到类似SQL这样的工具。智能合约就是这样的工具。

什么是智能合约

以太坊是一台全球计算机。 以太坊的节点遍布全球。 智能合约就是运行在 以太坊这个全球计算机上的特殊进程

为啥叫智能合约

也叫智能合同。 smart contract. 智能是可以自动化运行。 合约是因为以太坊的合约代码 涉及到一些资产转移。

如果要安装一个智能合约的开发环境,需要有一个以太坊节点。

不同区块链平台的智能合约需要安装 在 对应区块链平台的节点。

Go语言编写的 以太坊客户端:Geth: https://geth.ethereum.org/downloads

安装后添加到环境变量

Geth 三个网

  • 主网:以太坊真实节点运行的网络,节点遍布全球。使用的ETH是真实的虚拟数字货币。
  • 测试网:测试平台环境,
  • 私网:开发者自行组建的网络。

创建私网

  • 01 配置创世块文件 genesis.json
{
	"config": {
		"chainId": 18,
		"homesteadBlock": 0,
		"eip150Block": 0,
		"eip155Block": 0,
		"eip158Block": 0
	},
	"alloc": {},
	"coinbase": "0x00000000000000000000000000000000000000000000",
	"difficulty": "0x2",
	"extraData": "",
	"gasLimit": "0xfffff",
	"nonce": "0x000042",
	"mixhash": "0x00000",
	"parentHash": "0x0000",
	"timestamp": "0x00"
}

Coinbase: 挖矿后获得奖励的账户地址
Difficulty: 挖矿难度
gasLimit: 一个区块所能容纳gas的上限,智能合约指令咋执行时需要消耗gas. 通过以太币自动兑换
nonce: 随机值
mixhash:一个256位的哈希证明,与nonce相结合,验证本块的有效性。
extraData: 附件信息
parentHash: 前一块hash值,因为是创世块,所以为0