现在人人都在谈论加密货币,这要感谢比特币的炒作。比起比特币是否存在泡沫更为有趣的问题是比特币这种技术实际是怎么运作的和比特币的价值是什么。比特币的故事开始于2008年的一个名为“比特币:对等电子现金系统“的白皮书。本文中,作者 Satoshi Nakamoto(关于Satoshi究竟是谁还存在争论)介绍了一种新的革命性技术和理念:一种运行在区块链上的分散性的电子货币。这个想法从比特币开始传播,现在可以应用到许多其他领域。
![](http://img.shujuren.org/pictures/5K/5acb5483b5e84.jpg)
我首先在牛津大学区块链会议上介绍了区块链。 那里的每个人都对这项新技术的潜力感到非常兴奋。 公平起见,这听起来很有趣:一个分散的,不可破坏的货币交易数据库,合同或任何你喜欢的东西(例如,不可破解的投票机)。 区块链对加密社区的承诺是,它将以一种不再需要像银行或律师这样的第三方的方式彻底改变信任来影响整个行业 ——我们只需要**加密技术**的力量。
![](http://img.shujuren.org/pictures/ZT/5acb55c8c8e7e.jpg)
尽管区块链基本想法非常直观,但区块链实际在技术层面上的工作原理有点难以理解。 上周我在R博客上发现了这篇文章,BigData Doc用R中完全构建了一个区块链。利用构建的区块链可能不是世界上最有效和最实用的事情,但它对于理解区块链编程和背后的加密原则是个好方法。我也想理解它,这就是为什么我在R中实现一个较小版本的区块链:“**如果你可以编码,你当然明白它**”。
### 区块链是什么?
假设您的目标是以安全的方式存储一些数据。 为此,您首先将数据存储在一个容器中 – 您称之为块。 在比特币的情况下,每个块包含多个金融交易。 当有新的交易(或有新的数据)时,将创建一个新的区块,并与前面的区块一起形成一个链 – 区块链。
让我们来看看区块链如何利用密码学变得几乎不可破解。
#### 1 块
“`
block_example <- list(index = 1,
timestamp = "2018-01-05 17.00 MST",
data = "some data",
previous_hash = 0,
proof = 9,
new_hash = NULL)
“`
在开始构建区块链(将不同的容器和数据链接在一起)之前,您需要先了解两个概念:**哈希和工作量证明算法**。
#### 2 哈希
哈希有助于确保把块连接到链中其它块的完整性。哈希函数把某些内容作为输入,并为您提供唯一的加密输出。一个例子如下:
你给你朋友一个问题“Stata和R,那个是更好的统计编程语言”,并且你给她正确答案的哈希“71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86”,她现在只需将自己的答案输入哈希函数(在您的情况下使用SHA256算法),就可以自己检查她是否有正确的答案:
“`
library("digest")
digest("Stata" ,"sha256")
“`
[1] "3ac273f00d52dc9caf89cbd71e73e5915229a588117ca3441630089409ddb7bc"
“`
digest("R", "sha256")
“`
[1] "71ec0b920622cf4358bbc21d6a8b41f903584808db53ec07a8aa79119304ce86"
这对你有什么帮助?
在这种情况下,不仅可以将有关块(索引,时间戳,数据)的信息输入到散列函数,还可以输入前一个块的散列。 这意味着如果你知道前一个块的散列值,那么你只能计算有效的散列值,这是使用块之前的散列值创建的等,等等。 这为您提供了一个不可变的顺序链块。 如果以后要更改一个块,则必须再次计算顺序块的所有散列。
“`
hash_block <- function(block){
block$new_hash <- digest(c(block$index,
block$timestamp,
block$data,
block$previous_hash), "sha256")
return(block)
}
“`
### 3 工作量证明
如果有很多信息必须存储在区块链中,则需要创建大量新块。 在许多情况下,您想要控制创建了多少个新块。 例如在加密货币的情况下,如果每秒钟可以创建无限数量的硬币,硬币就会失去其价值。
因此,我们添加了一个所谓的“工作证明”(PoW)算法,它控制了创建新块的难度。 “证明”意味着计算机执行了一定的工作量。 实际上,目标是创建一个难以创建但易于验证的项目。 我将**使用以下“任务”作为PoW:找到下一个可以被99整除并且被最后一个数据块的证明号码整除的数字**。
“`
# pow算法
proof_of_work <- function(last_proof){
proof <- last_proof + 1
# Increment the proof number until a number is found that is divisable by 99 and by the proof of the previous block
while (!(proof %% 99 == 0 & proof %% last_proof == 0 )){
proof <- proof + 1
}
return(proof)
}
“`
对于像BitCoin或Ethereum这样的区块链,创建新区块的工作是由所谓的矿工完成的。当新的块必须创建时,计算问题被发送到网络。解决PoW问题的矿工首先创建新块,并以比特币奖励(这是实际创建新的BitCoin的方式)。这种发现新的正确证据的“彩票”确保了创建新块的权力是分散的。当一个新块被挖掘时,它被发送给每个人,这样网络中的每个节点都有最新的区块链副本。关于网络中最长的区块链(“最多的工作被投入”的区块链)是区块链的有效版本称为“分散化共识”。
在BitCoin的情况下,PoW问题涉及到找到产生具有一定数量的前导零的哈希的数字的问题(我发现的最佳解释是来自Savjee的这段视频)。为了说明计算速度和网络中矿工人数的增加,可以对PoW的难度进行调整,以在10分钟左右时间内创建新的块。
### 4 添加新块
现在你知道一个块是怎么样的,块是如何用哈希链接在一起的,以及创建新块的速度是如何由工作量证明算法调节的。 所以让我们把它放在一个函数中:
“`
#A function that takes the previous block and normally some data (in our case the data is a string indicating which block in the chain it is)
gen_new_block <- function(previous_block){
#Proof-of-Work
new_proof <- proof_of_work(previous_block$proof)
#Create new Block
new_block <- list(index = previous_block$index + 1,
timestamp = Sys.time(),
data = paste0("this is block ", previous_block$index +1),
previous_hash = previous_block$new_hash,
proof = new_proof)
#Hash the new Block
new_block_hashed <- hash_block(new_block)
return(new_block_hashed)
}
“`
在开始构建区块链之前,您需要在某处启动链。 这是通过使用所谓的**创世块**完成的。 它不包含任何数据和用于证明和以前散列的任意值(因为没有以前的块)。
“`
# Define Genesis Block (index 1 and arbitrary previous hash)
block_genesis <- list(index = 1,
timestamp = Sys.time(),
data = "Genesis Block",
previous_hash = "0",
proof = 1)
“`
### 5 构建区块链
现在您可以开始构建区块链了。 您从Genesis块开始,然后使用循环添加几个块。
“`
blockchain <- list(block_genesis)
previous_block <- blockchain[[1]]
# How many blocks should we add to the chain after the genesis block
num_of_blocks_to_add <- 5
# Add blocks to the chain
for (i in 1: num_of_blocks_to_add){
block_to_add <- gen_new_block(previous_block)
blockchain[i+1] <- list(block_to_add)
previous_block <- block_to_add
print(cat(paste0("Block ", block_to_add$index, " has been added", "\n",
"\t", "Proof: ", block_to_add$proof, "\n",
"\t", "Hash: ", block_to_add$new_hash)))
}
“`
如果你想添加更多的块,你会发现它需要越来越多的时间。 原因是证明号码呈指数增长。
![](http://img.shujuren.org/pictures/VO/5acb63e88e5e6.png)
对于像BitCoin这样的加密货币来说,这会成为一个问题,因为创建新块的时间应该或多或少保持不变(比特币的情况下大约需要10分钟)。 因此,PoW的难度必须不断调整,以应对计算速度的不断提高以及在特定时间网络中矿工人数的不断增加。
最后,看一下链中的最后一个块:
![](http://img.shujuren.org/pictures/56/5acb6590cc5ea.png)
### 总结
在这篇小文章中,您创建了最小的区块链。 主要目标是介绍区块链的外观,并介绍其背后的一些核心概念。 了解密码学的应用真正说明了人们为什么对区块链的可能性如此兴奋。
为了使区块链投入生产,需要做更多的工作:建立一个API,创建钱包,使用公私钥对的数字签名等。我也只是抓住了分散共识这一概念的表面,它是区块链网络的核心。
原文链接:https://www.datacamp.com/community/tutorials/blockchain-r
加入数据圈子或者商务合作,请加微信**luqin360**。