要解决的难题
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": 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
标签:比特,基本原理,以太,交易,哈希,区块,节点
From: https://www.cnblogs.com/clllll/p/17245805.html