导读:随着区块链成为国家战略,央行也推出数字货币,业界对区块链行业从业人员的需求越来越大;另外最近比特币价格又创新高,去中心化金融 DeFi 应用也非常火热,程序员业余也有开发了解区块链的需求。高可用架构翻译 blockgeeks 的系列文章,帮助大家更好学习及了解区块链开发。
在本文中,我们将向你介绍如何成为一名区块链开发工程师。正如你很快就会看到的那样,区块链开发与普通的互联网开发并没有本质不同。为了方便大家上手,我们编写了这篇指南来帮助大家学习区块链开发,并在每个小节给出了总结性的操作步骤。
早期比特币的开发范围比较有限,然而随着以太坊的发布,区块链开发的游戏规则发生了根本性的改变,以太坊是世界上第一个可编程的区块链。全球的开发者终于有机会在区块链之上构建自己的应用。这也是为什么学习区块链开发成为一项如此热门的技能的原因之一。
毋庸置疑,我们已经生活在“区块链时代”,它对我们未来的影响非常大。那么,如何才能在这场区块链革命中分得一杯羹呢?如果你想成为一名区块链开发者,那么你需要按照一定的方法。
希望通过这篇指南,你能开始你的区块链旅程。如果你想成为一名真正的区块链开发者,我们需要为你设定一些期望。首先,这需要时间,你需要将你的时间和资源投入到你的学习中。其次,不要期望立马就可以获得成果,区块链开发不能一蹴而就。
说了这么多,让我们开始正题吧。
成为一名区块链开发者 — 里程碑#1:了解基础知识
区块链开发工具
对于任何新的革命性的技术,比如区块链,最大的障碍之一就是熟悉系统中不可或缺的各种概念。
如果你是一个区块链初学者,你需要熟悉某些术语。
学习区块链技术
区块链:区块链 (1) 是由一条多个区块组成的链条,每一个区块都存储对应的数据,它没有任何中心化监管,而是通过密码学来保证安全和数据不可改变。
去中心化:区块链被认为是去中心化的,因为没有中心化机构监督。
共识机制:去中心化网络就某些事项达成共识的机制 (2)。
矿工:利用计算能力挖掘新区块的用户。
建议你多了解一下这些在加密领域广泛使用的术语。也可以浏览我们的综合词汇表 (3)。了解这些基本的术语非常重要,否则你会在进一步的学习中非常迷茫。
如果你对如何在区块链之上创建一个金融科技应用感兴趣,那么你一定要学习加密经济学的来龙去脉。大多数开发人员通常精通“加密”部分,但可能对“经济学”部分的知识一无所知。
鉴于此,不妨读一读经济学方面的知识,对其有一个大致的了解。如果你想了解一般的加密经济学,那么你可以在这里查看我们的文章 (4)。
如果你对密码学特别感兴趣,想知道数字签名是如何工作,以及了解公钥密码学的含义,那么请阅读这个 (5)。
之后,强烈建议你了解一下比特币的工作原理,比特币是区块链技术中传播最广泛、最好、最优雅的应用之一。你甚至可以说它是区块链技术所能达到的最优秀的例子,基于它所产生的影响。因此建议你阅读中本聪的比特币白皮书 (6)
(1) https://blockgeeks.com/guides/what-is-blockchain-technology/
(2) https://blockgeeks.com/guides/what-is-cryptoeconomics/
(3) https://blockgeeks.com/guides/blockchain-glossary-from-a-z/
(4) https://blockgeeks.com/guides/what-is-cryptoeconomics/
(5) https://blockgeeks.com/guides/cryptocurrencies-cryptography/
(6) https://bitcoin.org/bitcoin.pdf
现在,这完成了第一个里程碑。
让我们来回顾一下你需要在这一步完成的行动计划。
熟悉各种专业术语。
阅读区块链的更多技术方面的内容。
阅读比特币白皮书。
成为一名区块链开发者 — 里程碑 #2:熟悉流程
看到很多新晋 "开发者 "完全没有真实世界的一手经验,这是令人惊讶的。如果一个系统你一次都没有使用过,怎么可能对它进行创新和改进呢?
因此强烈建议你从今天开始熟悉这个系统。
去 Coinbase 或任何其他你熟悉的交易所购买一些币。你不需要创建一个广泛的投资组合,只需要购买一些币来观察整个流程是如何工作的。
这是非常直接的。既然你不打算购买大量的币,那么只需使用一个基本的在线钱包。
这些钱包是所有钱包中最容易使用的。创建超级简单,因为它基本上是在任何一个交易所服务上创建自己的账户。此外,你可以从世界上任何服务器或任何设备访问这个钱包,只要它连接到网络。说到这里,在线钱包有一个很大的问题。你的私钥会被保存在另一台服务器上。这基本上就像在银盆上向黑客提供你的密钥。不要使用在线钱包来存储大量的资金。仅存放你需要的最低限度的测试交易用途的金额。
当你创建一个广泛的加密货币投资组合时,你必须学会如何利用冷钱包来存储你的资金。你可以在这里学习如何这样做。后来,如果你开始了你的募资,那么你必须知道钱包,特别是多签钱包如何工作。
这一部分也将结束,艰难的部分从下一个里程碑开始。
这一节的行动计划包括:
了解交易所的工作原理
熟悉使用钱包。
成为一名区块链开发者 — 里程碑3:开始编码
作为一名区块链开发者,我们将在后端面临大量的挑战。由于一些原因,创建和维护一个公链并不容易。
原因1:安全
正如 David Schwartz 所说,区块链应该是堡垒。首先,代码是公开的,所有人都可以看到。任何人都可以查看代码,检查错误和漏洞。然而,与其他开放的代码资源不同,在区块链代码上寻找漏洞的缺点是巨大的。任何程序员都可以黑客入侵,并有可能获得数百万美元甚至数百万美元的资金。由于这些合理的安全问题考虑,区块链上的开发进展通常非常缓慢。
原因二:资源管理
跟上网络的节奏很重要,不能滞后而跟不上所有的网络请求。你需要应对远程和本地查询的访问。
原因3:性能
区块链必须始终以尽可能高的能力执行,但要做到这一点,所选择的语言必须是非常通用的。问题是,区块链中的某些任务是可以并行的,而有些任务是不能并行完成的。
数字签名验证就是可并行任务的一个好例子。签名验证所需要的就是密钥、交易和签名。只需三个数据,你就可以以并行化的方式进行验证。
然而,并不是区块链上所有的功能都应该这样做。想想交易执行本身。多个交易不能并行执行,需要一次只做一个,以避免双重支出等逻辑错误。有些语言擅长并行操作,而有些语言擅长非并行操作。
原因4:隔离
什么是确定性行为?
如果 A+B=C,那么无论在什么情况下,A+B 永远等于 C,这就叫确定性行为。
哈希函数是确定性的,即 A 的哈希值永远是 H(A)。
所以,在区块链开发中,所有的交易操作都必须是确定性的。你不能有一个交易的行为是一种方式,然后第二天又是另一种方式。同样,你不能让智能合约在两台不同的机器上以两种不同的方式工作。
唯一的解决方案是隔离。基本上,你将你的智能合约和交易与非确定性元素隔离。
有一些语言可以满足大部分需求,如果你是一个区块链开发者,那么你肯定需要掌握一些 C++ 和 JavaScript 的基本知识。
虽然 C++ 可能看起来有点过时,但事实是,它奇妙地满足了我们上面所描述的所有功能。事实上,中本聪用 C++ 编写了比特币的源代码。
它与 HTML 和 CSS 一起,是 WWW 内容制作的三大核心技术之一。Javascript 通常用于创建用户交互的网页。
那么,现在我们就来看看如何使用 Javascript 创建一个非常简单的区块链。
我们如何创建一个区块?一个简单的区块由什么组成?在我们将要开发的简单加密货币中(我们称它为 "BlockGeeksCoin"),每个区块包含以下信息:
索引:区块的编号
时间戳:区块的创建时间
数据:区块内的数据
Previous Hash:上一个区块的 hash 值。
Hash 值:当前块的 Hash 值。
在我们继续之前,你需要了解我们在程序中要用到的一些术语。
This: "this "关键字是在函数中被调用的,它使你能够访问调用该函数的特定对象的值。
构造函数。构造函数是一个特殊的函数,它可以帮助在一个类中创建和初始化一个对象。每个类只能有一个构造函数。
已经差不多了,让我们开始创建我们的区块。
创建新区块代码
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();
}
}
代码分析
好了,这里就创建了一个区块。在代码的第一行,我们调用了 crypto-js 库,因为 sha256 哈希函数在 JavaScript 中默认是不提供的。
接下来,我们在类里面调用了一个构造函数,来调用会有一定值的对象。吸引你眼球的可能是 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");
}
//p 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);
}
//p 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;
}
}
代码分析
好了,上面的代码中执行了很多操作,我们把它分成几个部分。
第一部分:创世纪块
什么是创世区块?
创世区块是区块链的第一个区块,之所以特殊,是因为每个区块都指向之前的区块,而创世区块并不指向任何东西。所以,在创建新链的那一刻,创世区块会立即被创建。
因此,你可以看到一个 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);
}
那么,这里发生了什么?我们是如何添加区块的?我们如何检查给定的区块是否有效?
还记得一个区块的内容吗?每个区块有前一个区块的哈希值,对吗?
所以,我们在这里要做的很简单。将新出块的 previousHash 与最后一个区块哈希值进行比较。
如果这两个值相匹配,那么就意味着新的区块是合法的,它被添加到区块链中。
第三部分:验证链
现在,我们需要检查没有人对我们的区块链进行破坏,一切都很稳定。
我们使用 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.
if (currentBlock.hash !== currentBlock.calculateHash()) {
return false;
}
if (currentBlock.previousHash !== previousBlock.hash)
{
return false;
}
}
return true;
}
如果当前区块的 previousHash 不等于前一个区块的 Hash,那么这个函数将返回 False,否则将返回 True。
使用区块链
现在,我们终于要使用区块链来创建我们的 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 }));
就是这样!
那么这里发生了什么?
我们基于区块链创建了一个新的加密货币,并将其命名为BlockGeeksCoin。通过调用这个新对象,我激活了构造函数,进而自动创建了创世区块。
我们只需再给它添加两个区块,并给它们一些数据。
就是这么简单。
这个里程碑就到此为止了。让我们看看行动计划。它非常简单,但肯定也不容易。
在众多的区块链友好语言中选择一种进行学习,比如 C++,Javascript,C#,Go 等。
(由于篇幅关系,今天先发布第一部分,接下来合约部分敬请期待,着急的读者也可以阅读英文版了解全文)
英文全文:
https://blockgeeks.com/guides/blockchain-developer/
参考阅读:
本文由高可用架构翻译,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。
高可用架构
改变互联网的构建方式