查看原文
其他

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

Ameer Rosic 以太坊爱好者 2019-12-11

BlockGeeks 深入指南

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

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

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

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

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

小目标 1:基础知识

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

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

  • 区块链:区块链是一条由区块链接而成的数据链,在区块中包含具体数据,并且整个系统没有中心化监管。区块链具有加密安全、不可篡改的特点。

  • 去中心化:区块链具有去中心化的特性,是因为其中没有中心化权威监管机构。

  • 共识机制:在去中心化网络(编者注:中译本见文末超链接《》)中,就某些具体问题(事务)上达成共识的机制。

  • 矿工:使用计算能力挖区块的用户。

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

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

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

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

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

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

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

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

  • 熟悉各种术语和词汇。

  • 阅读更多关于区块链技术方面的内容。

  • 阅读比特币白皮书。

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

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

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

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

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

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

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

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

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

  • 了解交易所是如何工作的。

  • 熟悉钱包(网上线包、冷钱包、多重签名钱包等)是如何工作的。

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

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

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

(这里有个油管视频链接:https://youtu.be/w4jq4frE5v4)


  • 理由 1:安全

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


  • 理由 2:资源管理

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


  • 理由 3:性能

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

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

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


  • 理由 4:隔离

什么是确定性行为?

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

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

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

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

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

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

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

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

以下内容来自 savjee.be 。

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

  • Index (索引):标识区块编号

  • Timestamp (时间戳):标识区块产生时间

  • Data (数据):区块中包含的数据

  • Previous Hash (前一区块Hash值):前一区块 Hash 值。

  • Hash (哈希值):当前区块的Hash值。

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

  • This:在函数中调用 “This” 关键字,你就能够通过 this 关键字访问当前对象的函数或属性,从而获取其取值。

  • Constructor(构造函数):构造函数是一个特定用于在类中创建并初始化类对象的函数。每个类都仅能拥有一个构造函数。

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

创建 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 类的定义中拥有太多内容,让我们分成几部分来分析。


  • 第 1 部分:创世块

什么是创世块?

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

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

createGenesisBlock() { return new Block(0, "01/01/2017", "Genesis block", "0"); }
  • 第 2 部分:添加区块

首先,我们需要获取当前区块链中最新的区块是哪一个。为此我们通过 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字段的数值与前一区块的哈希值,就可以判断区块是否合法了。

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

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


  • 第 3 部分:验证链

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

我们使用 “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 提供的神奇而简单的解释。)

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

  • 学习一种适合编写区块链的语言,例如:C++,Javascript,C#,Go 等。

小目标 4:智能合约学习

如何定义智能合约?

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

你可以在我们的说明文档中了解更多有关智能合约的内容。

那么,在我们的智能合约中,我们想要哪些特性呢?

在区块链上运行的任何东西都必须是不可变的,并且必须在不损害其完整性的情况下在多个节点运行。因此,智能合约需要具备以下三点特性:

  • 确定性

  • 有限性

  • 隔离


特征 1:确定性

一个程序是确定的是指其针对某一特定输入在任意时刻都具有相同输出。例如,如果 3+1=4,那么3+1将一直等于4(假设相同的基数)。因此,当一个程序在不同计算机上对于相同的输入集给出相同的输出时,就认为程序是确定性的。

以下就是程序按照不确定性的方式执行的几种情况:

  • 调用不确定性的系统函数:当程序员在程序中调用不确定系统函数时。

  • 不确定性数据资源:如果一个程序在执行过程中所需的数据是不确定性的,那么这个程序就是不确定性的。例如,一个程序需要获取某一特定查询在 Google 搜索中前10 的结果。那么这个列表将持续变化。

  • 动态调用:当一个程序调用另一个程序时,就被称作动态调用。由于只有在执行过程中才能确定调用结果,所以这种调用也是不确定的。


特征 2:有限性

在数学逻辑中,有一类错误叫做“停机问题(halting problem)”。从根本上说,它指出不能判断一个程序能否在有限时间内执行完成它的函数。在1936年,阿兰·图灵(Alan Turing)利用 乔治·康托尔(Georg Cantor)的对角线论证法推导出,没有办法知道一个给定的程序能否在有限的时间内执行完成。

这显然是智能合约必须面对的一个问题,因为根据合约的定义,智能合约必须能够在有限时间内执行完成。为此我们采取了一些措施,能够在外部 “杀死” 合约,从而避免陷入无限循环而耗尽资源:

  • 图灵不完备性:图灵不完备的区块链的功能有限,不能进行跳转或者循环。因此他们并不能陷入无限循环。

  • 按照执行步骤付费:一个程序可以简单地记录其已经执行的 “步骤” 数,例如,其执行的指令的数量,然后在执行步数达到特定数值后终止程序。另一种方法是使用计价器。合约根据预付的费用执行。每条指令的执行需要消耗特定数量的费用。如果预付的费用使用完了,那么合约地执行也停止。

  • 计时器:预设一个计时器。如果合约执行时间超过时间限制,则从外部终止其执行。


特征 3:隔离

在区块链中,任何人都可以上传智能合约。然而,某些合约可能有意或无意地包含病毒或Bug。如果合约不是相互隔离的,就可能会影响到整个系统地运行。因此,必须保证智能合约在沙盒中互相隔离,才能避免对整个生态系统产生负面的影响。

我们已经了解了这些特征,了解它们如何执行也是十分重要的。通常智能合约是选择以下两个系统中的一个执行的:

  • 虚拟机:以太坊使用这种方法。

  • Docker:Fabric使用这种方法。

让我们比较一下这两种方案,并确定哪种方案使得生态系统更好。为了简单起见,我们将比较以太坊(虚拟机)和Fabric(Docker)。

如果你对以太坊开发很感兴趣,那么你还必须学好 Soidity 语言。

对于任何想开发 DAPPs(去中心化应用程序)或者想进行 ICO 的人来说,学习 Solidity 语言是十分必要的。我们已经有了一份详细的指南,你可以在这里阅读。然而,在这里我们将向你简单地介绍一下总结流程。Solidity 语言是 Gavin Wood, Christian Reitwiessner, Alex Beregszaszi, Yoichi Hirai 和几位前以太坊核心开发者开发的,可以使用 Solidity 语言编写智能合约,并且在区块链平台(例如以太坊)上执行。

Solidity 是一种有意设计得精简而松散的编程语言,其语法规则与 ECMAScript(JavaScript)十分相似。以太坊设计原理文档中指出了一些必须要记住的要点,我们当前的运行环境是 32 byte 指令集的 stack-and-memory 模型,EVM(以太坊虚拟机)是的我们能够访问程序 “堆栈” 就像寄存器空间一样,我们可以通过制定内存地址给程序计数器从而实现循环和跳转操作(基于顺序程序控制),一个可扩展临时 “内存” 和一个更持久的 “存储” 实际上是永久地写入区块链中。最重要的是,EVM 要求智能合约必须是完全确定性的。

如果你想系统地学习 Solidity 语言,在这里可以查看我们的强化课程。

那么,让我们现在回顾一下步骤:

  • 理解智能合约是如何工作的。

  • (以太坊开发者选做)学习 Solidity。


小目标 5:学习交流 融会贯通

作为一名萌新开发者,你可以做的最重要的事情之一就是不断地学习交流、融会贯通。

加入 Reddit 论坛,Github Pages 和 StackExchange 多与其他开发者交流,随时关注关于这项技术的消息。

与此同时,这将有助于你了解当前区块链开发者关注的重点是什么。公司在招聘是需要具备那些素质?你可以在这里获取相关信息。

这些信息将在你完善你的技能以及引起公司注意的过程中非常有用。

总结

因此,这就是你成为一名区块链开发者的大致路线图。当然,单凭这一点是完全不够的,你需要自己主动积极学习,并且始终处于这种状态。

如果你正在寻找有关区块链开发的相关资料可以点击这个链接。

我们祝你学习的旅途中一切顺利!


原文链接: https://blockgeeks.com/guides/blockchain-developer/
作者: Ameer Rosic
翻译&校对: 林鹏 & Elisa


你可能还会喜欢:

实战 | 教练,我“只”想学Solidity

如何使用Solidity编写安全的智能合约代码?

http://ethfans.org/rubyu2/articles/128

教程 | 用 Go 构建一个区块链 -- Part 1: 基本原型

http://ethfans.org/posts/building-blockchain-in-go-part-1

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存