clllll  

要解决的难题

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": 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

image

初始Solidity

以太坊是第一个诞生只能合约的区块链平台

Solidity是一门面向对象、为实现只能合约而创建的高级编程语言。

在线IDE: https://remix.ethereum.org/

posted on 2023-03-22 22:48  llcl  阅读(127)  评论(0编辑  收藏  举报