区块链基础
大纲
学习区块链,要解决的问题:
哈希算法
非对称加密算法,例如RSA,ECC椭圆曲线加密
数据结构 例如mercle tree
分布式架构,分布式架构中经典的CAP理论。分布式账本。
P2P网络通信
比特币的一个区块中,包含了什么信息?
一个区块是怎样产生,怎样加到链上的?
P2P系统的共识算法有哪些?比特币采用的Pow算法是怎样实现的?
每个节点中记录了多少区块链的信息?轻节点和全节点的区别?
比特币源码大部分是使用C++开发的。
比特币脚本是一种独特的语言
比特币钱包可以用任意编程语言实现,用Java也可以。
以太坊平台编程语言是solidity,其风格与JavaScript类似。
Fabric框架对Go语言的支持比较友好。
Rust语言是非常新的一门语言,有其独特优势。
哈希算法
1, 什么是哈希算法?
哈希是hash的音译,也翻译作散列函数,不是一种固定的算法而是一种思想。
哈希算法可以把任意长度的输入,经过散列算法算出固定长度的输出。
典型的散列函数有无限的定义域,和有限的值域。哈希算法是不可逆的(hiding)。
并非所有哈希算法都是均匀散列的,但为了减少哈希碰撞,应该把哈希算法设计为均匀散列。
2, 有哪些常用的哈希算法?
MD5,SHA-1,SHA-2系列(包括SHA-256)
3, 比特币采用的是什么哈希算法?
SHA-256
4, 经过SHA-256算法的计算会生成多少位的数字?
64位16进制数字。
5, 什么是哈希碰撞?
对于给定的哈希函数和X,计算出H(X),若找到了Y≠X,且H(Y)=H(X),则称之为哈希碰撞。
哈希碰撞是无法避免的,但可以足够难。如果一种哈希算法的人为寻找哈希碰撞足够难,则
称为collision resistance。
6, SHA-256具备哪些性质?
SHA-256是一种哈希算法,所以首先具备hiding的特性,
而且使用SHA-256算法是很难认为制造哈希碰撞的,代价足够大,所以具备collision resistance特性
从上述两个特性推测,我们能够实现digital commitment
这也是比特币采用这种哈希算法的原因。
此外比特币还要求puzzle friendly特性,就是说给定一个哈希值范围,我们无法预测输入是怎样才能满足
哈希值属于该范围。
椭圆曲线加密
0,非对称加密算法需要解决什么类型的数学问题?
要解决正向计算很简单(多项式时间复杂度),而逆向计算很难(指数级时间复杂度)的问题。
主流的非对称加密算法有RSA,ECC等。
1,什么是公钥私钥?有什么作用?
公钥私钥是一对儿密钥,用于对明文信息加解密。其中公钥是公开给外界的,
私钥是只有自己知道的,需要保密 。公钥加密的消息只有用私钥才能解密。
私钥加密的信息只有用公钥才能解密。
2,非对称加密的加解密过程是怎样的?
例如A给B发信息,需要途径C,在不加密
的情况下,C能看到A对B发的信息内容。而非对称加密的过程是这样的,B公开
公钥,外界包括A,C都能获得B的公钥,A想给B发信息,首先用B的公钥对明文
进行加密并交给C,C没有解密方法,看不到信息内容,交给B,B用自己的私钥进行解密,
获得信息内容。
3,非对称加密签名算法的过程是怎样的?
A如何证明发出的消息是A发出的,而不是别人?
首先A用自己的私钥对信息的哈希值进行加密,哈希值和密文发送给B,B使用公钥解密,
与哈希值对比,一致则证明是A发出的,不是别人。
4,椭圆曲线加密算法中的椭圆曲线具体指什么?
由方程描述的曲线:y²=x³+ax+b 其中4a³+27b²≠0
5,为什么密码学上不直接使用椭圆曲线,而是使用有限域上的椭圆曲线?
实数域的椭圆曲线是连续的,有无限个点,运算过程不精确。而密码学要求有限个点,要求运算精确。
其方程为:y²=x³+ax+b mod p 其中4a³+27b²≠0 mod p
p 为质数,x y a b 为小于p的非负整数。
6,如何根据椭圆曲线上的G点和给定的k,计算kG点?
在G点作切线,与椭圆曲线交叉于A点,则A关于x轴的对称点为2G点。
连接G和2G点作直线,与椭圆曲线交叉于B点,则B关于x轴的对称点为3G点。
依次类推,直到求出kG点。
7,如何根据有限域椭圆曲线的G点和给定的k,计算kG点?
相关公式如下: 有限域GF§上的椭圆曲线y² = x³ + ax + b,若P(Xp, Yp), Q(Xq, Yq),且P≠-Q,
则R(Xr,Yr) = P+Q 由如下规则确定:
public Point plusPoint(P,Q){//伪代码
Xr = (λ² - Xp - Xq) mod p //求R点的X值
Yr = (λ(Xp - Xr) - Yp) mod p //求R点的Y值
其中λ = (Yq - Yp)/(Xq - Xp) mod p(若P≠Q), //P≠Q时求参数λ
λ = (3Xp² + a)/2Yp mod p(若P=Q) //P=Q时求参数λ
return R(Xr,Yr);
}
Point G1 = new Point(0,1); //举例说明,求G1(0,1)点的kG1
Point kG1 = new Point(0,1);
for(int i=0;i<k;i++){
kG=plusPoint(kG1,G1); //多次循环,调用k次plusPoint求得kG
}
8,有限域椭圆曲线加密算法中的公钥私钥分别指什么?能否根据公钥和G计算私钥?
k和kG,其中公钥kG记为K。
根据私钥计算公钥难度较低(多项式计算),
根据公钥和G计算私钥难度为指数级,几乎不可能。
9,有限域椭圆曲线加解密的过程是怎样的?
明文message记为椭圆曲线的点M(明文嵌入,有相关算法支持)
形成一个随机数r
加密者已知:M r G K
加密过程是形成点对C={rG,M+rK}
解密者收到C,已知k,G
解密过程:M+rK-k*rG=M+rkG-rkG=M
10,有限域椭圆曲线签名加解密过程是怎样的?
发送者(已知私钥k,公钥K = kG,G点(x,y))有消息M,首先对M求哈希h,并准备一个随机数r。
s = (h+kx)/r,签名{rG,s}
发送M和签名{rG,s}给接收者。
验证过程:
求得M的哈希值h。
求(hG+Kx)/s = (hG+kGx)®/(h+kx) = rG(h+kx)/(h+kx) = rG
若求得的rG和接收到的rG一致,则证明发送者身份真实。
11,比特币选择的是什么曲线?
实际应用中,我们并不需要关心椭圆曲线的众多参数如何选取(要选对参数对于普通使用者来说
并不现实),只要从密码学家们精心挑选的一堆曲线中选择一个就行了。一般来说曲线Curve25519,
prime256v1是比较常用的,比特币选择secp256k1则是因为它效率较高,并且其参数是可预测的,
降低了包含后门的可能性。
G点怎么取?
比特币中的G点是一个常数,对于所有比特币用户来说都是同一个。
12,比特币的钱包地址和公钥有怎样的关系?
钱包地址是公钥经过哈希和编码生成的,详见钱包地址生成图。
参考:
椭圆曲线加密算法https://www.jianshu.com/p/e41bc1eb1d81
比特币地址详解https://www.jianshu.com/p/a2ea3b44f6eb
关于密码中的RSA算法和ecc(椭圆曲线)算法加密过程是怎样的?https://blog.csdn.net/love_hot_girl/article/details/81164945
CAP BASE
CAP
C consistency 一致性
A available 可用性
P partition tolerance 分区容错性
首先要理解分区容错性:P成立:容:允许。允许分区,允许犯错。
也就是说允许任意节点之间的网络故障,即节点之间传输的消息丢失这种情况出现。
P不成立:不允许任意节点之间的信息传输丢失。
在分布式系统中,节点之间传输信息丢失是无法避免的,你没法保证网络那头不会停电,
也没法知道他掉线是因为他妈妈拔了网线。
所以分布式系统一定要分区容错,允许分布式系统中的节点宕机掉线。
C 是一致性,即分布式系统中的各个节点的数据应保持一致。
如果强调一致性,则每次节点收到写请求并写入新数据,
会锁定其他节点的读写操作并要求其他全部节点都同步数据,数据一致之后才解锁。
考虑到分区容错性的存在,则过于强调C可能会导致同步操作的时间很长而影响可用性。
A 是可用性,即发送的请求能比较快的收到响应。
强调A可用性,则需要牺牲一些一致性。
C和A之间不可能完全同时满足,需要权衡,找到一个平衡点。
这就引出了BASE理论。
核心思想是:既然无法做到强一致性,那么就让分布式系统中的每个节点(应用)根据
自身特点,采用适当的方式来使系统达到最终一致性。
Basically Available 基本可用
Soft State 软状态
Eventually Consistency 最终一致性
最终一致性指的是分布式系统经过一定时间后能够让节点之间数据达到一致。最终两个字很微妙,
因为系统达到一致所经历的时间可能是几毫秒,也可能是几个小时。
软状态指的是在系统达到最终一致性之前存在的,各个节点之间数据可能不一致的状态。
基本可用指的是系统虽然出现了一些不可预知的故障,但基本上还是能用的,只是相比于正常系统
而言,会有响应时间上的损失或功能上的损失(如引导到降级页面)。
在实践当中,应根据系统业务具体特点权衡取舍。
例如银行转账强调的是一致性,要求数据务必准确,
电商抢购可以引导到降级页面,可以读到库存脏数据,但下单时会校验数据库中真实库存并提示库存不足。
区块链数据结构
1、比特币的一个区块包含哪些信息?
每个区块首先包含很多笔交易tx[ ~ ~ ~]。2020年区块容量1mb,大约包含4000笔交易信息。
这些交易的信息的哈希值通过Merkel Tree生成一个根哈希(字段mrkl_root),用于Merkel Proof
还包含前一个区块的哈希值prev_block。(为了保证整条区块链不可篡改)
此外还包含版本号、时间戳、区块大小、区块号、高度、随机值nonce等等很多信息。
2、什么是Merkel Tree?
个人理解:存储hash值的二叉树,作用是通过根节点的一个哈希值验证全部数据是否正确。
3、在实践中,我们可以在区块链浏览器,通过区块高度查看区块信息,也可以通过交易哈希查看每一笔交易的详细信息。我们还可以调用开发者提供的API来进行这些查询操作。
共识协议
1、什么是拜占庭将军问题?
在有叛军的情况下,将军们如何通过信使传递信息并达成一致的问题。
叛军数目不可以超过比例,否则会达不成一致,比例高到一定程度甚至会达成错误共识。
设将军数N,含叛变将军数f,达成一致的条件为:N>3f+1
验证:假设4个将军,含1个叛军,
2、解决拜占庭将军问题的算法是?
PBFT算法
3、比特币采用什么共识算法?
Pow proof of work 工作量证明。
4、挖矿和记账的过程是怎样的?
区块链可以看作一个分布式的账本,全节点,一般是大型矿场,具备完整的账本。
挖矿的目的是获取记账权的,记账的时候可以记录一笔原本不存在的比特币给自己,相当于铸币。
挖矿的具体过程:矿工首先打包一个区块,区块中包含很多笔交易,然后不断随机生成nonce值并计算区块哈希值,试图使区块哈希值满足<目标阈值target,一旦找到合适的nonce,则向其他节点广播,得到其他节点验证和认可后,矿工就会把区块写入区块链。而其他矿工节点则会删除这个区块中有,自己也有的交易,保留这个区块中没有,自己区块中有的数据,重新打包和计算。
区块链进阶
大纲
区块链进阶实战:
1、如何使用Java开发一款比特币钱包?
1.1、如何用Java生成比特币公私钥对和钱包地址?
2.2、如何用Java发起比特币转账?
2、比特币如何挖矿?以太坊如何挖矿?尝试以太坊挖矿并获取收益。
3、以太坊平台如何开发DAPP?
4、用Java实现区块链,实现比特币系统。
如何使用JAVA开发一款比特币(或其他币种的)钱包?
工作原因,完成了一款交易所波场钱包的开发,这里以波场为例讲一下钱包开发的思路。
钱包要实现的基础功能包括:
扫描区块获取区块信息;
离线生成公私钥对儿和地址;
离线打包一笔交易并签名;(这里包括trx和合约代币,两者有很大区别)
发布广播,把交易发布上链;
钱包要实现的业务功能包括:
生成地址池;
用户绑定地址;
回写;(
根据数据库中块高扫描指定区块的交易信息,取出转入地址字段value,与数据库中取出的用户钱包list进行比对,如果匹配上,证明用户充值进来了,把充值交易信息存入数据库。
)
归集;(
代币归集比较复杂,因为代币的转账需要消耗trx作为手续费,以usdt为例,首先取交易哈希,到链上查询交易是否成功,如果交易成功再进行下一步。
把成功的交易存入一个待处理的队列。
从队列中取出来一笔交易的转入地址,查询该地址中手续费是否充足。
如果充足,则进行下一步,如果不足,则转入一定量的trx作为手续费再进行下一步。
把该地址中的usdt转入归集主账户。
从队列中把这笔交易删除,把回写表中的归集状态更新为已经归集。
)
入账;(
定时任务中,取出状态为:已归集、未入账的交易,根据交易地址找到数据库中的用户及用户钱包表,根据交易数量给用户钱包增加余额,最后把交易状态更新为已入账。
)
提现自动打币;
来源:oschina
链接:https://my.oschina.net/u/4313437/blog/4913177