区块链个人笔记,潦草,个人草稿。

一个十九岁的小孩儿,喜欢玩魔兽世界,直到有一天,暴雪公司把魔兽里一个他喜欢的技能给去掉了,他非常生气,多次找暴雪公司反馈,没有得到任何满意的结果,他一气之下就不玩了,后来他就想为什么会出现这种情况。本质上是因为,这个游戏是一个中心化平台上的游戏,决定权在公司。所以他决定要创建一个去中心化的平台,用户不满意,就有选择分叉的权利。美国金融危机的时候,美联储搞量化宽松,发行了大量的货币,增加货币供给量,美国很多老百姓是不满意的,尤其是退休的老人,因为钱变得不值钱了。在一个去中心化的系统里,就可以分叉出现一个新的货币,若以太坊的团队,哪一天搞量化宽松,大规模增加以太币的供给量,引起很多人的不满,那这些人就可以分叉出来,继续维护原来的以太坊,所以存在分叉的选项,恰恰是民主的一种体现。
有了比特币,就不需要钱和银行了。可挖矿难度越来越大,它又不适合作货币。如黄金不适合作货币,总量基本变化不大,黄金总量的增加远比不上社会财富的增速,在少数人手中,后面的人的努力就没有意义。货币需要在一定时期多发一些。

区块链 一个去中心化的账本。
UTXO Unspent Transaction Outputs 未花费的交易输出。

密码学原理

collision resistance 比如你上传一个很大的文件,存到某个云存储服务上,将来用到的时候再把它下载回来,怎么知道下载的版本和当初上传的版本是一样的呢,在上传文件时算一个哈希值出来,这个哈希值存在本地,将来下载之后再算一个哈希值,如果一样,说明文件没有被篡改。
hiding x -> H(x)
puzzle friendly 哈希值的计算事先是不可预测的,光看输入很难看出哈希值是什么,
digital commitment
digital equivalent of a sealed enveloup

difficult to solve,but easy to verify
SHA-256

比特币中的数据结构

指针,结构体在内存中的起始位置,哈希指针除了存贮地址之外,还要保存这个结构体的地址,一般用H(x),从这个哈希指针,不光可以找到这个结构体的位置,同时还能检测出结构体的内容有没有被篡改。
在这里插入图片描述
genesis 创世 tamper 篡改

Merkle tree 用哈希指针代替普通的指针。
在这里插入图片描述
在这里插入图片描述
sorted merkle tree 不存在证明

BTC协议

double spending attack 花两次攻击
货币是否在你手里

在这里插入图片描述
它的输出里面有A的公钥的哈希,转账交易说明的,这个A的公钥,要跟币的来源的里面说明的A的公钥的哈希要对应的上。要是对不上的话,说明币的来源是不对的。如果有人冒名顶替,把自己的公钥说成A的公钥,验证不通过。

轻节点没有参与区块链的构造和维护,它只是利用了区块链的一些信息,做一些查询之类。

CAP Theorem Consistency、Availability、Partition tolerance

sybil attack 女巫攻击
hyperledger 超级账本
根据 hash of prev block 知道插在哪儿

coinbase transaction 是唯一产生一个新的币的途径
比特币很早和实体世界产生联系的时候,用2万个比特币买了个披萨饼。
得到记账权,挖矿。

比特币网络

simple,robust,but not efficent

BTC挖矿

1、分叉攻击
2、Boycott

比特币脚本

基于栈的语言
在这里插入图片描述
locktime 生效时间,0是立即生效。
在这里插入图片描述
txid 之前的这个交易的哈希值
vout 这个交易的第几个输出
在这里插入图片描述
value 交易的金额,给对方转多少钱。
0.22684000个比特币 or 两千两百六十八万四千聪
n是序号,表示这个交易的第几个输出。
reqSigs 指需要多少个签名才能兑现。
addresses 输出的地址
在这里插入图片描述
验证这个交易的合法性,把B转给C这个交易里的输入脚本,跟A转给B的输出,拼接在一起执行。
在这里插入图片描述
第一条,把输入脚本里提供的签名压入栈。
第二条,把输出里提供的公钥压入栈。
第三条,把栈顶的这两个元素弹出来,用公钥检查一下这个签名是否正确。
在这里插入图片描述
第二种形式,输出脚本里没有直接给出收款人的公钥,给出的是公钥的哈希,公钥是在输入脚本里给出的。输入脚本既要给出签名,也要给出公钥。
输出脚本里的一些操作,比如DUP,HASH160,都是为了验证签名的正确性。这种形式是最常用的一种形式。
在这里插入图片描述
前两条语句来自输入脚本,后面的语句来自输出脚本。
第一条把签名压入栈,第二条把公钥压入栈,第三条DUP把公钥复制一遍。
HASH160把栈顶元素弹出来,取哈希,然后把哈希再压入栈,所以栈顶变成了公钥的哈希值,下面那条语句,是把输出脚本里提供的公钥的哈希值压入栈,这个时候栈顶有两个哈希值,上面这个哈希是输出脚本提供的,收款人的公钥的哈希,发布这个交易的时候,这个钱转给谁的。下面这个哈希,是你要花这个钱的时候,在输入脚本里给出的公钥,然后前面那个操作,HASH160取哈希后得到的。EQUALVERIFY是弹出栈顶的两个元素,比较它们是否相等,目的是防止有人冒名顶替。用它自己的公钥冒充收款人的公钥。假设这两个哈希值是相等的,就从栈顶消失了。最后CHECKSIG,弹出栈顶的两个元素,用公钥检查这个签名,是否正确,假设签名是正确的,整个脚本顺利结束,栈顶留下的是TRUE。如果执行过程中任何一个环节发生错误,比如输入里给出的公钥,跟输出里给出的哈希值,对不上,或者是输入里给出的签名,跟给出的公钥对不上,那么这个交易就是非法的。
在这里插入图片描述
最后一种,也是最复杂的一种。这种形式的输出脚本给出的不是收款人的公钥的哈希,而是收款人提供的一个脚本的哈希,这个脚本叫做redeemScript,将来花这个钱的时候,输入脚本里要给出这个redeemScriptScript这个赎回脚本的具体内容,同时还要给出让这个赎回脚本能够正确运行所需要的签名,验证的时候分为两步,
在这里插入图片描述
在这里插入图片描述
这里的输入脚本就是给出签名,再给出序列化的赎回脚本,赎回脚本的内容就是给出公钥,然后用这个CHECKSIG检查签名。下面这个输出脚本是用来验证,输入脚本里给出的赎回脚本是否正确。
在这里插入图片描述
P2SH的执行过程,开始的时候也是把输入脚本和输出脚本拼接在一起,前两行来自输入脚本,后面三行来自输出脚本。首先把输出脚本里的Sig压入栈,然后把赎回脚本压入栈,然后是取哈希的操作,得到赎回脚本的哈希,RSH是指redeemScriptHash,赎回脚本的哈希值,接下来还要把输出脚本里给出的哈希值压入栈,这个时候栈里就有两个哈希值了,最后用EQUAL比较两个哈希是否相等。
在这里插入图片描述
第二阶段的验证,首先要把输入脚本里提供的序列化的赎回脚本进行反序列化,反序列化的操作图片没有展现出来,这是每个节点自己要完成的,然后呢,执行这个赎回脚本,首先把这个PubKey压入栈,然后用CHECKSIG验证一下输入脚本里给出的这个Sig的正确性,验证结束之后,整个P2SH才算完成。

BTC分叉

1、state fork
2、protocol fork :hard fork、soft fork

不要把51%的域值当作是一个绝对的门槛,达到51%就可以发动攻击,不到51%就不能发动攻击,这个其实都是概率。而且每个矿石所占算力比重本身也是一个估计而已,而且是在不断变化的,这是第一种分叉攻击。

BTC匿名性

pseudonymity 使用假名
零知识证明 同态隐藏

BTC思考

为什么比特币系统能够绕过分布式共识中的那些不可能结论?
比特币系统没有达到真正意义上的共识。
电话线 拨号上网。
不要被学术界的思维限制了头脑,不要被程序员的思维限制了想象力。知识改变命运,但对知识的一知半解有可能使命运变得更差。
区块恋。
稀缺性,一个好的货币是要有通货膨胀的功能的。每年黄金产量增加的速度,远远赶不上社会新创造财富的速度。
量子计算,与其担心量子计算对比特币的冲击,还不如担心量子计算对传统金融的冲击。
取哈希的过程一般会造成信息的损失,哈希函数一般都是不可逆的。从这个哈希值没有办法推导出原来的数是什么。
SHA-256 比特币中用的哈希算法,算出的哈希是256位的,不论这个输入有多大,这样的运算显然是不可逆的,否则,变成一个超级无敌的压缩算法。
比特币系统中,仅仅是为了收钱的话,没必要把公钥暴露出来,只暴露一个公钥的哈希生成的地址就行了,取钱的时候需要一个公钥和私钥产生的一个签名。

以太坊概述

增加了smart contract
比特币出块时间10分钟,以太坊10几秒,莱特币2分半。
以太坊memory hard mining puzzle,目的是,在一定程度上限制了ASIC芯片的使用,叫做ASIC resistance。
proof of work ->proof of stake 工作证明 -> 权益证明。
smart contract 智能合约。
BitCoin :decentralized currency
Ethereum :decentralized contract
BTC 单位 Satoshi 一聪
ETH 单位 Wei

ETH账户

account based ledger
以太坊对double spending attack 有天然的防御作用
double spending attack 花钱的人不诚实
replay attack 收钱的人不诚实 解决办法 nonce 随机数 计数器 记录一共发生多少次交易
externally owned account 外部账户 balance nonce
smart contract account 合约账户 code storage
financial derivative 金融衍生

有没有可能收款人的地址,这个节点,以前从没听说过? 以太坊跟比特币是一样的,创建账户的时候,是不需要通知其他人的,只有这个账户第一次收到钱的时候,其他的节点才会知道这个账户的存在。这个时候要在状态树中新插入一个节点。

ETH状态树

trie树 retrieval 检索
Patricia tree 经过路径压缩的前缀树。

地址空间 2^160 为什么不缩短一些,访问效率还快?
以太坊中的普通账户创建方法跟比特币系统是一样的,没有一个中央的节点,每个用户自己独立创建账户,在本地产生一个公私钥对儿,就是一个账户,怎么防止两个人的账户正好碰撞呢,这种可能性是存在的,但是比地球爆炸的可能性还要小,怎么达到这样的概率,就是地址要足够长,要分布足够稀疏,才不会产生碰撞,看上去有点儿浪费,但这是一个去中心化的系统防止账户冲突的唯一办法。

genesis 开端,创世
patricia tree/trie 树变浅
键值稀疏的时候用路径压缩比较好
merkle patricia tree MPT 以太坊中用的是modified MPT
protocol buffer / protobuf 做序列化的库

能不能证明某个账户是不存在的,MPT中的某个键值是不存在的?
sorted Merkle tree 的好处是可以证明nonmembership。跟sorted Merkle tree类似,如果存在的话,在什么样的分支,把这个分支作为merkle proof发过去。

状态树中保存的是(key,value)pair,key就是地址,账户的状态是怎么存储的,实际上它要经过一个序列化的过程,RLP,用这个编码做序列化,之后再存储。Recursive Length Prefix,

ETH-GHOST

unclehash 可能比 parenthash 大好多辈分
orpham block stale block
centralization bias
uncle block 得到7/8的出块儿奖励
鼓励分叉之后及早进行合并
比特币是人为地制造稀缺性,以太坊是为了调整挖矿难度。
人们一般把比特币看作数字黄金;以太坊看作石油,用来消耗的,这个不说很恰当。
把叔父区块包含进来的时候,要不要执行?
检查叔父的合法性,交易是否合法不检查。

只有分叉后的第一个区块可以得到分叉奖励,后面的都不行。
在这里插入图片描述

ETH挖矿算法

bug bounty 赏金

为什么一大一小数据集?
16M Cache 1G dataset DAG
轻节点保存16M的Cache就行了 只有需要挖矿的矿工保存1G的数据集

假设要对比特币系统进行攻击,需要买入大量的资金买入.

比特币交易一次耗一千度电,以太坊67千瓦时。

Infiticide 扼杀在摇篮里
比特币 10分钟 莱特币 两分半

DPOS :Delegated Proof of Stake

挖矿 有网有电的地方

ETH智能合约

先执行,再挖矿

最初,比特币区块链选用了一种依赖节点算力的工作量证明共识(proof of work,简称 POW)机制来保证比
特币网络分布式记账的一致性.随着区块链技术的不断演进和改进,研究者们陆续提出了一些不过度依赖算力
而能达到全网一致的算法,比如权益证明共识(proof of stake,简称 POS)机制、授权股份证明共识(delegated proof
of stake,简称 DPOS)机制、实用拜占庭容错(practical Byzantine fault tolerance,简称 PBFT)算法等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值