要解决的难题
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模型
比特币的账户模型,和传统的余额模型不一样。不存在账户,只有地址。
账户:私钥 (账户管理权)公钥(私钥加密产生的,不可逆) 比特币地址(公钥经过俩次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
智能合约
区块链最核心的功能就是存储功能(记账),是一种特殊的数据库,想要在区块链这样的数据库上进行应用开发,就需要找到类似SQL这样的工具。智能合约就是这样的工具。
什么是智能合约
以太坊是一台全球计算机。 以太坊的节点遍布全球。 智能合约就是运行在 以太坊这个全球计算机上的特殊进程
为啥叫智能合约
也叫智能合同。 smart contract. 智能是可以自动化运行。 合约是因为以太坊的合约代码 涉及到一些资产转移。
如果要安装一个智能合约的开发环境,需要有一个以太坊节点。
不同区块链平台的智能合约需要安装 在 对应区块链平台的节点。
Go语言编写的 以太坊客户端:Geth: https://geth.ethereum.org/downloads
安装后添加到环境变量
Geth 三个网
- 主网:以太坊真实节点运行的网络,节点遍布全球。使用的ETH是真实的虚拟数字货币。
- 测试网:测试平台环境,
- 私网:开发者自行组建的网络。
创建私网
- 01 配置创世块文件 genesis.json
{
"config": {
"chainId": 12345,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0,
"ethash": {}
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
Coinbase: 挖矿后获得奖励的账户地址
Difficulty: 挖矿难度
gasLimit: 一个区块所能容纳gas的上限,智能合约指令咋执行时需要消耗gas. 通过以太币自动兑换
nonce: 随机值
mixhash:一个256位的哈希证明,与nonce相结合,验证本块的有效性。
extraData: 附件信息
parentHash: 前一块hash值,因为是创世块,所以为0
C:\golang_learn\block>geth init genesis.json
INFO [03-23|22:02:02.361] Maximum peer count ETH=50 LES=0 total=50
INFO [03-23|22:02:02.375] Set global gas cap cap=50,000,000
INFO [03-23|22:02:02.377] Using leveldb as the backing database
INFO [03-23|22:02:02.378] Allocated cache and file handles database=C:\Users\lzl\AppData\Local\Ethereum\geth\chaindata cache=16.00MiB handles=16
INFO [03-23|22:02:02.400] Using LevelDB as the backing database
INFO [03-23|22:02:02.461] Opened ancient database database=C:\Users\lzl\AppData\Local\Ethereum\geth\chaindata\ancient/chain readonly=false
INFO [03-23|22:02:02.463] Writing custom genesis block
INFO [03-23|22:02:02.464] Persisted trie from memory database nodes=3 size=397.00B time="508.6µs" gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-23|22:02:02.522] Successfully wrote genesis state database=chaindata hash=c3638c..f97051
INFO [03-23|22:02:02.523] Using leveldb as the backing database
INFO [03-23|22:02:02.523] Allocated cache and file handles database=C:\Users\lzl\AppData\Local\Ethereum\geth\lightchaindata cache=16.00MiB handles=16
INFO [03-23|22:02:02.542] Using LevelDB as the backing database
INFO [03-23|22:02:02.604] Opened ancient database database=C:\Users\lzl\AppData\Local\Ethereum\geth\lightchaindata\ancient/chain readonly=false
INFO [03-23|22:02:02.608] Writing custom genesis block
INFO [03-23|22:02:02.608] Persisted trie from memory database nodes=3 size=397.00B time=0s gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [03-23|22:02:02.673] Successfully wrote genesis state database=lightchaindata hash=c3638c..f97051
C:\golang_learn\block>geth version
Geth
Version: 1.11.6-unstable
Git Commit: 8a9a73c99b292bfcb832342877be48856397ee2f
Git Commit Date: 20230321
Architecture: amd64
Go Version: go1.20.2
Operating System: windows
GOPATH=C:\Users\lzl\go
GOROOT=
启动节点命令
geth --networkid 12345 --port 30303 --http --http.api personal,eth,db,net,web3 --allow-insecure-unlock console
初始Solidity
以太坊是第一个诞生只能合约的区块链平台
Solidity是一门面向对象、为实现只能合约而创建的高级编程语言。
在线IDE: https://remix.ethereum.org/