如何成为区块链开发者:速成课!

教程

如何成为区块链开发者:速成课!

Ajian | 28. Feb, 2018 | 12191 次阅读

BlockGeeks 深入指南

在本指南中,我们将向你讲解如何成为一名区块链开发者。为了便于理解,我们将此指南划分为不同的部分,并在每一部分结尾提供具体的操作步骤。

1

我们现在正处于“区块链时代”,区块链对我们的未来有着巨大的影响。那么,你应该如何加入“区块链大潮”呢?如果你想成为一名区块链开发者,那么有几个小目标你必须达成。

希望在阅读完本指南后,你可以掌握开始区块链开发的必要技能。如果你真的想成为一名区块链开发者,我们希望你能够达到以下目标。第一,时间,你必须投入足够的时间和精力用于学习。第二,不要急于求成,成为区块链开发者并不是一念之间。

说到这里,让我们开始吧!

如何成为一名区块链开发者:速成课!

1

小目标 #1:基础知识

区块链技术作为一种全新的革命性的技术,要想初步入门,最大的障碍就是熟悉系统中各种各样的概念。

如果你是一名初学者,那么你必须熟悉以下几种名词的具体含义:

你最好多了解一些加密领域中广泛使用的术语。此外,强烈建议你阅读学习我们的综合词汇表,学习掌握这些基本术语是十分必要的,否则你可能在具体学习过程中错失较多信息且较难理解。那么,接下来,是时候学习更多区块链技术方面的内容了。

如果你对如何在区块链上搭建“金融技术”应用方面的技术内容感兴趣,那么你绝对应该比较详细了解加密经济学的来龙去脉(编者注:中译本见文末超链接)。大多数开发人员通常精通“加密”的相关知识,但对于“经济学”的理解却非常匮乏。

当你阅读研究现在网络中某些 众筹 时就会发现,这种知识储备的差异是非常明显的。很明显,他们的ICO文件在经济方面的规划明显不足。

因此,鉴于此,为了更好地学习,需要多学习一些经济学的知识并有一个大致的概念。如果你想大致了解加密经济学,可以阅读我们的一些文章。

如果你对密码学特别感兴趣,并且想了解数字签名如何工作,以及公钥加密的含义等内容,那么可以阅读此篇文章。

此外,我们强烈建议你了解比特币的工作原理。比特币是目前区块链技术最广泛、最优秀的应用之一,鉴于其广泛的影响力,甚至都可以称比特币为区块链技术之所以能够成功问世的最好的实例。

因此,我们建议你阅读中本聪写的比特币白皮书。你可以通过此链接获取。现在第一个目标就完成了。

让我们检查一下到目前为止你需要完成的步骤:

小目标 #2:了解整个过程是如何工作的

让人惊讶的是,有许多萌新“开发者”并根本没有真正使用过加密数字货币。当没有真正的使用经验的时候,又怎么可能在一个平台上进行创新和改进呢?

强烈建议你从今天起逐步熟悉区块链系统,“真正”熟悉。

去 Coinbase 或者其他你熟悉并且在你的国家允许开设的交易所买一些币。你不需要确定一个具体的投资方案,只需要购买少量的币并且观察系统整个过程是如何工作的。

整个过程非常简单明了。既然你不计划购买大量的加密数字货币,那么我们仅使用一个基本的网上钱包即可。

这些网上钱包使用起来非常方便。钱包的创建也非常简单,因为它基本上是在任意交易所服务上创建你自己的账户。此外,只要可以连接到网络,你便可以在世界上任意服务器或设备访问这个钱包。不过话虽如此,对于网上线包来说仍有一个较大的问题。你的私钥将被保存在另一台服务器上,这就像把家钥匙放在硬盘里交给黑客一样。因此,不要使用网上钱包存储大量钱,只需要存储你需要用于完成交易的最低限额即可。

当你需要创建一个投资组合时,就必须学会如何使用冷钱包保存你的资产。你可以在这里学习怎么做。之后,如果你要创建你自己的 ICO,你必须清楚钱包是如何工作的,特别是多重签名钱包是如何工作的。

这一部分我们就讲到这里,困难的部分将从下一个小目标开始。

到目前为止你需要完成的步骤如下:

小目标 #3:让我们开始写码吧!

作为一名区块链开发者,你将在后端面对大量的挑战。由于许多原因,创建并维护一条公链并不容易。

(在我们继续之前,让我们先看一下 David Schwartz 在 CPPCON 2016 上发表的主题演讲:使用 C++ 进行区块链软件开发。)

(这里有个油管视频链接:)

正如 David Schwartz所说,区块链系统应该是一座堡垒。首先,(区块链的)代码是完全开源的。任何人都可以查看源代码,并且寻找代码中的 Bug 和缺陷。然而,与其他开源项目不同的是,在区块链代码中发现漏洞的代价是巨大的。任何(发现漏洞的)程序员都可以通过这个漏洞攻击,并获得数百万美元的收益。处于以上合理的安全性考虑,区块链的开发往往非常缓慢。

与网络保持同步是非常重要的。你(的开发进度)不能落后全网需求太多。你的系统应该能够很好地处理远程和本地请求。

区块链系统必须始终保持其最高的数据处理能力,但为了做到这一点,编程语言的选择必须是非常通用的,以满足并行化、高吞吐量等需求。然而,在区块链中有一些任务是可以并行执行的,但有些任务则不能并行执行。

一个很好的“并行化”任务的例子就是数字签名验证。验证数字签名所需的所有内容即密钥、交易和签名。只要有这三种数据,你就可以以并行的方式进行验签。

然而,并不是所有的区块链函数(模块)都可以这么做。设想一下交易执行本身,多个交易并不能够并行执行;它需要一次处理一笔交易,以避免类似于双花等错误。有些编程语言擅长进行并行化操作,但有些则不太擅长。

什么是确定性行为?

如果 A + B = C,那么无论什么情况下,A + B 永远等于 C。这就叫做确定性行为。

Hash 函数是确定性的,意味着 A 的哈希值永远是 H(A)。

因此,在区块链的开发中,所有交易的执行必须是确定性的。(区块链系统中的)同一笔交易不能在不同时刻的执行结果不同。相似的,智能合约不能在不同的机器上执行结果不相同。

唯一的解决方法就是隔离。简单来讲,就是将区块链系统中智能合约和交易,与非确定因素隔离开来。

有一些编程语言可以满足大部分需求。如果你是一名区块链开发者,那么你绝对需要一些 C++ 和 JavaScript 的基础知识。

虽然 C++ 看起来有点过时,但事实是它能够很好地满足我们以上描述的所有需求。实际上,中本聪就是使用 C++ 来编写的比特币源码。

(JavaScript) 与 HTML 、CSS 一起是万维网内容生产的三大核心技术之一。JavaScript 通常用于创建高交互的Web页面。

因此,现在我们讲讲述如何使用 JavaScript 语言编写一个简单的区块链系统。

以下内容来自 savjee.be 。

我们如何创造一个区块?一个简单的区块由什么组成?在我们将要编写简单的加密币(让我们称之为 “BlockGeeks 币”),每个区块中将由以下几部分信息组成:

在我们继续讲解之前。你需要理解我们将要在项目中使用的以下术语:

那么现在,我们开始创建我们的区块。

创建 Block 类

const SHA256 = require("crypto-js/sha256"); 
class Block 
{ 
constructor(index, timestamp, data, previousHash = '') 
{ 
this.index = index; 
this.previousHash = previousHash; 
this.timestamp = timestamp; 
this.data = data; 
this.hash = this.calculateHash(); 
} 
calculateHash() 
{ 
return SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString(); 
} 
}

Code Analysis

好的,这就是一个区块的定义。在代码的第一行,我们调用 crypto-js 库,因为在 JavaScript 中没有 sha256 的哈希函数。

接下来,我们调用类中的构造函数,在创建拥有具体数值的对象时调用。你也许已经注意到了 calculateHash() 函数。下面让我们来看看它是如何工作的。

在一个区块中,我们获取所有属性的数值,通过哈希函数获取它们的哈希值作为该区块的哈希值。我们使用 JSON.stringify 函数将区块的数据转换成字符串后,与区块中其它数据一同求哈希值。

很好,到目前为止我们已经准备好一个区块,可以继续了。现在让我们把区块连接起来组成一条区块链。

创建一条区块链:成为一名区块链开发者

class Blockchain
{
//Section 1 Genesis block creation
 constructor() 
{ 
this.chain = [this.createGenesisBlock()]; 
} 
createGenesisBlock() 
{
 return new Block(0, "01/01/2017", "Genesis block", "0"); 
} 
//section 2 adding new blocks
getLatestBlock() 
{ 
return this.chain[this.chain.length - 1]; 
} 
addBlock(newBlock) { 
newBlock.previousHash = this.getLatestBlock().hash; 
newBlock.hash = newBlock.calculateHash(); 
this.chain.push(newBlock); 
} 
//section 3 validating the chain
isChainValid() 
{ 
for (let i = 1; i < this.chain.length; i++)
{ 
const currentBlock = this.chain[i]; 
const previousBlock = this.chain[i - 1]; 
if (currentBlock.hash !== currentBlock.calculateHash()) { 
return false; 
} 
if (currentBlock.previousHash !== previousBlock.hash) 
{ 
return false; 
} 
} 
return true; 
} 
}

代码分析

在 Blockchain 类的定义中拥有太多内容,让我们分成几部分来分析。

什么是创世块?

创世块就是区块链中第一个区块,它之所以特殊的原因就是区块链中每一个区块都应该通过哈希值指向前一区块,但创世区块并不指向任何区块。因此,一条新链创建之时创世区块就立刻被创建了。

此外,你注意观察 “createGenesisBlock()” 函数,我们是手动给创世块赋值的:

createGenesisBlock() 
{
 return new Block(0, "01/01/2017", "Genesis block", "0"); 
} 

首先,我们需要获取当前区块链中最新的区块是哪一个。为此我们通过 getLatestBlock() 函数获取区块链中最新区块。

getLatestBlock() 
{ 
return this.chain[this.chain.length - 1]; 
} 
Now that we have determined the latest block, let’s see how we are going to add new blocks.
现在我们已经获取到了最新区块,让我们看看如何将新区快添加到区块链中。
addBlock(newBlock) { 
newBlock.previousHash = this.getLatestBlock().hash; 
newBlock.hash = newBlock.calculateHash(); 
this.chain.push(newBlock); 
} 

那么,到目前为止发生了什么?我们如何添加新区快?我们应该如何检查所给区块是否合理?

还记得区块中包含的内容么?每个区块不是有前一个区块的哈希值么?

那么我们检查区块链中区块数据的合法性就容易的多了。通过比较当前区块中Previous Hash字段的数值与前一区块的哈希值,就可以判断区块是否合法了。

img

图片来源:Lauri Hartikka 在 Medium 上发表的文章

如果以上两个哈希值相等,那么意味着新区快是合法的,并且可以被添加到区块链中。

现在,我们需要检查是不是没有人干扰我们的区块链,并检查是不是一切都很稳定。

我们使用 “for” 循环遍历从区块 1 到最新区块。创世区块是区块 0。

for (let i = 1; i < this.chain.length; i++)
{ 
const currentBlock = this.chain[i]; 
const previousBlock = this.chain[i - 1]; 
In this part of the code we are defining two terms, current block and previous block.  And now we are simply going to find the hash of these two values.
在这部分代码中我们定义了两个变量,currentBlock 和 previousBlock。
现在我们仅需要获取这两个区块的哈希值(就可以验证区块的合法性)
if (currentBlock.hash !== currentBlock.calculateHash()) { 
return false; 
} 
if (currentBlock.previousHash !== previousBlock.hash) 
{ 
return false; 
} 
} 
return true; 
}

如果当前区块的 “previousHash” 字段与前一区块的哈希值不相等,那么该函数会返回 false,否则会返回 true。

使用 Blockchian 类,创建区块链实例。

现在,我们将使用 Blockchain 类创建我们的 BlockGeeksCoin。

let BlockGeeksCoin = new Blockchain(); 
BlockGeeksCoin.addBlock(new Block(1, "20/07/2017", { amount: 4 })); 
BlockGeeksCoin.addBlock(new Block(2, "20/07/2017", { amount: 8 })); 

就是这样!

那么现在发生了什么?

我们基于 Blockchian 类创建了一种新的加密数字货币,并且命名它为 BlockGeeksCoin。通过调用这个新对象,我激活了(Blockchian 类的)构造函数,从而自动创建了创世区块。

我们简单地添加了两个区块在区块链中,这两个区块的数据是随机给的。

是的!就是这么简单!

(非常感谢 savjee.be 提供的神奇而简单的解释。)

第三个小目标达成!让我们看一看具体操作。它非常简单但绝对不容易:

小目标 #4:智能合约学习

4

如何定义智能合约?

根据维基百科的定义,智能合约是“一种旨在促进、验证或执行合约谈判或履行的计算机协议”。1996年,美国密码学专家 Nick Szabo 首次提出了这一概念,而以太坊通常被认为是普及这一概念并使之成为主流的原因。