Go语言与区块链(二)

一、比特币相关技术

1. 加密技术

在比特币系统中使用加密技术保证交易的安全性。加密技术分为对称加密和非对称加密。

(1)对称加密

对称加密就是加密和解密使用相同的密钥。例如:DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

特点:效率高,算法公开,安全性取决于密钥大小。密钥越长,安全性就越高,但是效率也越慢。除此以外,密钥分发也是对称加密面临的另外一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。所以,现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

(2)非对称加密

使用公钥和私钥进行加解密。公钥对外公开,私钥用于加密和签名,仅自己持有,绝不对外公开。常见非对称加密算法有rsa、ecdsa等。

非对称加密解决了密钥传递过程的安全问题。例如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。

虽然非对称加密很安全,但是和对称加密相比,它显得非常的慢。所以,在实际应用中还是使用对称加密来传递消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

特点:安全性高,加密算法复杂,效率低。

应用场景:数字签名、数字证书。

 

2. P2P网络

P2P(peer-to-peer):点对点技术,无中心服务器,依靠用户群交换信息的互联网体系。

网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力、打印机等),这些共享资源通过网络提供服务和内容,能被其它对等节点(Peer)直接访问而无需经过中间实体。在此网络中的参与者既是资源、服务和内容的提供者(Server),又是资源、服务和内容的获取者(Client),P2P体系结构是应用层概念。

特点:耐攻击、高容错、地位平等。

应用场景:BT下载、电驴下载。

3. 工作量证明

工作量证明,简称POW(Proof of work)。比特币区块链通过竞争记账方式解决去中心化的账本一致性的e问题。竞争记账是个过程,而不证明竞争结果。比特币系统采用PoW机制来实现竞争结果判定。

简单来说,PoW是确认做了多少工作量的证明。我们都说比特币挖矿是算一道题,那它是算什么呢?其实它就是对当前打包好的交易进行哈希sha256运算,那哈希运算很简单啊,为什么说是难题呢?比特币的难题是要求矿工找一个特定的哈希值。我们都知道哈希运算的结果毫无规律可循,找一个明确的哈希是不现实的,我们要有难度,又要可行性,所以挖矿要求找一个比目标值小的哈希值即可。

演示:https://anders.com/blockchain/blockchain.html

比特币系统会自动设定一个难度值,比如0x000f00000000000000。这个难度值我们是不知道的,所以需要我们自己去猜测。但是如何去猜呢?答案是在挖矿的时候,加入一个随机数(Nonce)。通过不断改变Nonce的值,从而生成不同的哈希值。如果生成的哈希值比系统预设难度值小,就代表挖矿成功。

二、比特币地址的生成

image-20180905080912905

比特币钱包地址的生成流程:

(1)对公钥进行sha256和ripemd160加密,得到公钥哈希;

(2)在公钥哈希前面加上一个字节的版本号(00:主网,01:测试网,02:私有网络),得到payload;

(3)对payload执行两次的sha256加密,然后取前面4个字节的数据,得到checkSum;

(4)把payload和checkSum进行拼接,得到checkCode;

(5)对checkCode进行base58加密,得到最终的地址值;

 

三、比特币系统参数

1. 出块时间

大约10分钟产生一个区块。产生区块的难度值是动态调整的,猜对的人越多,难度就会增大。大约每2016个区块调整一次(2周左右时间调整一次)。

2. 出块奖励

最初每个区块奖励50BTC,随后每21万个区块奖励减半(21万 * 10分钟 / 60分钟 / 24小时 / 365天 = 4年,也就是大约每4年奖励减半),当前奖励为12.5BTC。

3. 比特币总量

package main

import "fmt"

func main() {
	rewardCount := 50.0   // 奖励BTC的数量
	blockInterval := 21.0 // 单位为万
	total := 0.0          // 比特币总量

	for rewardCount > 0 {
		// 计算每一个区间的比特币数量
		sum := blockInterval * rewardCount
		// 每次循环,BTC奖励数量减半
		rewardCount *= 0.5
		// 计算比特币总量
		total += sum
	}
	fmt.Printf("比特币总数:%f 万\n", total)
}

运行结果为:2100万。也就是说,比特币总量大约为2100万个。

四、比特币结构

区块是组成比特币系统的基本单位。比特币的区块大小被严格限制在1Mb以内。在区块中有区块头和区块体,如下图所示:

(1)区块头

区块头记录了该区块的基本信息。比如:版本号、上一区块的哈希、时间戳、梅克尔根、随机数、数据等等。

(2)区块体

区块体记录了该区块的交易数据。第一条交易是挖矿交易,其他交易是普通交易。

每一个交易都包含输入input和输出output。输入代表钱的来源,输出代表钱的流向。但是挖矿交易没有输入,只有输出。

猜你喜欢

转载自blog.csdn.net/zhongliwen1981/article/details/89633695