要成为年薪百万的技术大牛必经历这5个阶段, 收好这份超实用的技术进阶指南 | 技术头条

2019-04-28 15:26:16 浏览数 (1)

来源 | blockgeeks

编译 | 王柯凝

出品 | 区块链大本营(blockchain_camp)

2018年的那股区块链热潮也着实让区块链开发人员火了一把,他们(她们)拿着几十万,甚至是上百万的年薪,头顶着耀眼的光环,成了大家心目中的男神。

你有没有想过,要成为一名内行的区块链开发者?其实区块链开发并没有想象中的那么遥不可及。今天就跟着营长一步一步,系统地了解从事区块链开发需要掌握哪些知识,以及如何进行实操吧!

首先声明,成为一个真正的区块链开发者,需要足够的决心。你需要花费大把的时间学习区块链技术。其次,欲速则不达,千万不要急于求成!

STEP 1:熟悉、理解基本术语

不管是区块链技术,还是任何其他新的革命性的技术,掌握这些技术首先需要跨越的就是这些技术所包含的基础概念。如果你连基本术语都不了解,还谈何进一步的使用和开发?需要理解的基本概念如下。

  • 区块链:是由很多区块组成的链,每个区块都由数值数据组成,且没有任何中央监督。从密码学上来讲,区块链是安全且不可篡改的。
  • 去中心化:由于区块链并不接受任何中央机构监督,因此,区块链是一种去中心化的技术。
  • 共识机制:去中心化网络在某些事项上需要达成共识的机制。
  • 矿工:使用计算力挖掘区块链区块的用户。

不过,你也不要以为知道这几个术语就能轻松进阶成为一名开发者了。这还远远不够,你还得自行查阅更多更全面的区块链词汇表,你会发现还有更多你需要了解的术语,例如共识、DAO、ASIC、EVM等。

不要轻视这些基本术语,如果你不下功夫,在后续的学习中就会特别容易迷失方向。

大致了解了区块链的基本术语,下一步就可以学习更多关于区块链技术方面的知识了。

如果对区块链上金融方面的应用程序感兴趣的话,建议你学习下“加密经济学”。在现实中,大部分开发人员通常都精通于技术中的“加密”部分,但是“经济”方面的知识真的很匮乏

这种知识上的差异在你研究ICO时就凸显了,很多ICO项目失败的原因,就在于他们对于经济学知识的欠缺。因此,了解一些经济学知识对掌握区块链技术大有裨益。

除此之外,在进行系统的学习区块链技术之前,我还建议你最好研究下比特币的工作原理。比特币是最早、应用最广泛、最棒的区块链技术应用之一。当你了解比特币以后,你就明白,比特币之所以会成为区块链技术的经典,究其原因就是比特币的影响力之深远

那么,应该如何全面的了解比特币呢?中本聪的比特币白皮书是你的最佳选择:

https://bitcoin.org/bitcoin.pdf

总结一下就是,在开始区块链技术开发之前,你需要先理解以下知识:

  • 熟悉区块链各类术语和词汇;
  • 阅读更多区块链技术方面的文章;
  • 阅读比特币白皮书。

STEP 2:了解加密货币的交易过程

你可以问问身边的人,很多自称「区块链开发者」的人根本没有任何现实世界的加密货币买卖经验。试想一下,如果你都没有使用过任何一个加密平台,又谈何基于这个平台做进一步的创新和改进呢?

所以,从现在开始,你需要熟悉这些平台。那么,应该从何下手呢?

首先,你可以登录Coinbase或者任何一个加密货币平台,使用一个基本的在线钱包,买入一些加密货币。你不需要考虑是不是要创建一个高回报率的投资组合,因为你不是来做风险投资的,而是来了解加密货币的买卖过程,你只需要拿出一点钱买几个加密货币体验一下即可。

在线钱包是所有加密钱包中最简单的一种,并且创建方式非常简单,因为你可以在任何交易所创建。另外,只要有网络,你就可以在世界上任何一个地方访问并使用你的在线钱包。话虽如此,但是,在线钱包有一个很大的缺陷:你的私钥保是存在另外一台服务器上,也就是说,这就相当于你把密钥直接暴露在黑客面前了。因此,千万不要在在线钱包中存大量的资金,这真的相当危险,最后只能是哑巴吃黄连,有苦说不出。

说点题外话,如果你想创建一个高收益率的投资组合,一定要学会如何使用冷钱包存储你的资产,冷钱包相对来说就安全很多。

STEP 3:编写代码

了解了加密货币交易过程之后,我们就可以进行编码,创建一个真正的区块链了。但是,你要做好准备,因为你将会面临巨大的挑战——创建和维护一个公有区块链相当不容易,原因如下。

挑战1: 安全性的挑战

区块链是一个壁垒。首先,区块链技术的代码是完全开源的,任何人都可以查阅代码,检查错误和漏洞。不像其他开源代码那样,区块链代码漏洞一旦被发现,它的负面影响将会非常大,因为这里边都是钱啊!任何程序员都可以黑进系统,这样数百万甚至数千万美元的资金就会面临巨大的风险。因此,安全性让区块链面临着巨大的挑战。

挑战2:资源管理方面的挑战

作为一个与网络有密切联系的技术,跟上网络的步伐非常重要。落后太多,或者跟不上网络需求,这可就摊上大事了。另外,你还得能很好的处理远程和本地请求。

挑战3:性能方面的挑战

区块链必须拥有高效处理事务的能力,但事实上,有些任务是可以在区块链上并行实现的,而有些则不能。

区块链“可并行化”任务最好的案例就是数字签名验证。你只需要拥有密钥、交易和签名,就可以以并行的方式进行验证。

然而,并不是所有的功能都要并行实现,这得考虑事务本身的情况。有些事务并不能并行执行,而是一次只能执行一个事务,以避免出现“双重消费”的失误。另外,有些编程语言比较擅长于并行操作,但是有些则不适用。

挑战4:隔离性

什么是确定性行为?如果a b=c,那么无论在什么情况下,a b总是等于c,这就是所谓的确定性行为。

哈希函数就是一个确定性行为,这就意味着a的哈希值总是H(a)。

我们知道,在区块链的开发过程中,所有的事务和操作都必须是确定性的,你不能让一个事务今天以这种方式运行,明天又以另外一种方式运行。同理,你也不能再两台不同的服务器上运行两种不同的智能合约。

决绝这一问题的唯一办法就是隔离性。也就是说,将智能合约和交易完全隔离开来。这样,有些编程语言就可以满足这些要求了。

如果你想要成为一名合格的区块链开发者,那么你一定要掌握一些C 和JavaScript的基本知识。

虽然C 看起来比较过时,很多开发人员都不再使用了,但是对于以上的这些要求,C 完全满足,是一个非常完美的编程语言。并且,你要知道,大名鼎鼎的中本聪就是用C 编写的比特币源代码。

和HTML、CSS一样,JavaScript也是网络开发的三大核心技术之一,通常用于创建高度交互的的网页。

创建一个区块

下面,我们就来看看如何使用JavaScript创建一个简易区块链吧!在这里,我们将它称为「BlockGeeksCoin」。

一个简单的区块应该由什么组成?通常来说,每个区块所包含的信息如下:

  • 索引:区块的索引号。
  • 时间戳:创建区块所用的时间。
  • 数据:区块中的数据。
  • 前项哈希值:前一个区块的哈希值。

在创建BlockGeeksCoin之前,我们需要了解程序中使用的这些术语:

  • this:函数内部调用“this”关键字,就可以访问调用特定函数的特定对象的内部值。
  • 构造器(Constructor()):构造器是一个特殊的函数,也叫构造函数,可以帮助开发人员创建和初始化类中的对象,一个类只能有一个构造函数。

OK,准备工作完成,让我们开始创建一个简单的区块吧!代码如下:

我们来分析下上述代码。在代码的第1行调用了一个 crypto-js库,因为在JavaScript中,不能直接使用SHA256哈希函数。

接下来第4行代码,我们在类中使用了一个构造函数Constructor,来调用某些对象的值。

最后,我们使用了calculateHash()函数。在每个区块中,我们获取到所有的内容,并对其进行哈希处理,得到特定区块的哈希值,在这里,我们使用JSON.stringify()函数将区块中的数据转换为字符串,以便对其进行哈希处理。

现在,我们就可以把这些区块连接起来,形成区块链了。

创建区块链

这一部分,可以根据以下代码来进行操作:

我们将这一大段代码分解成3个部分。

第一部分,创世块:什么是创世块?创世块是区块链上第一个创建的区块,之所以这个区块非常特别,这是因为区块链上每个区块都指向它的前一个区块,然而,创世块没有指向任何东西。因此,一旦创建了一个新的区块链,就一定会有一个创世块。

createGenesisBlock()函数中,我们手动给出了区块数据,如下所示:

第二部分,添加区块:在添加区块之前,我们需要知道当前区块链中最后一个区块是什么,在这里,用getLatestBlock()函数获取最后一个区块的信息。

获取到最后一个区块信息后,我们应该如何添加新的区块呢?又该如何检查给定区块是否有效?在这里,我们使用addBlock()函数添加新的区块,代码如下:

我们已经知道,一个区块中要含有上一个区块的哈希值。按照这个思路,我们就要将新的区块的哈希值和给定区块的哈希值进行比较,看看是否匹配。

如果这两个哈希值相匹配,这就意味着新的区块是合法的,就可以将其添加到区块链中。

第三部分,验证区块链:成功添加了新的区块后,我们就需要检查是否有人扰乱我们的区块链,系统是否稳定。我们使用“for”循环从第一个区块开始检索,创世块是第0个区块。

如果当前区块的“previousHash”不等于前一区块的“Hash”,函数则返回“False”,否则,返回“True”。

现在,我们终于可以使用这个区块链来创建我们自己的BlockGeeksCoin了。

在上述代码块中,我们基于区块链创建了一种新的加密货币,并将其命名为BlockGeeksCoin。通过调用新的对象,激活了构造函数,又反过来自动创建了Geeks区块。在这里,我们只是简单的增加了两个区块,并添加了一些区块数据信息。

STEP 4:学习智能合约

到底什么是智能合约?维基百科的定义是:一种以促进、验证、强制协商或履行合约为目的的计算机协议

智能合约工作原理

1996年,美国密码学家尼克 · 萨博首次提出这一概念,但人们通常认为伊斯利姆推广“智能合约”这一概念,并使之成为主流。

那么,智能合约有哪些理想特性呢?我们知道,任何在区块链上运行的事务都是不可篡改的,并且在不损坏其完整性的前提下,能够运行多个节点。

因此,作为一种契约,智能合约需要具备以下三种特性:

  • 确定性
  • 可终止性
  • 独立性

特性1:确定性

如果一个程序每次都给与给定输入相同的输出,那么这个程序就是确定性的。比如:如果3 1=4,那么3 1永远等于4。因此,当一个程序在不同计算机中给与相同的输入,如果输出也相同,那么这个程序就被称为确定性程序

当一个程序以不确定的方式运行时,可能是以下几种原因引起的:

  • 调用不确定的系统函数:开发人员在程序中调用不确定性函数。
  • 不确定的数据资源:如果一个程序在运行时使用的数据是不确定的,那么该程序将会变得不确定。比如:假设一个程序获取了某个特定查询的前10个Google搜索结果,这10个结果可能会不断变化,因为这些数据资源是不确定的。
  • 动态调用:当一个程序调用第二个程序时,就叫做动态调用。由于调用的目的仅在执行过程中确定,因此,这本质上也是不确定的。

特性2:可终止性

在数理逻辑中,我们有一个叫做「停机问题」的错误。通俗的来说,停机问题就是判断任意一个程序是否会在有限时间内结束运行的问题。1936年,阿兰·图灵用康托的对角线问题推导出,没办法确定一个程序是否能在有限的时间内结束运行

这显然也是智能合约的一大问题,因为根据智能合约的定义,合约必须要在给定的时间内终止运行。

为此,我们采取了以下措施,从外部「停止」合约,而不是让程序陷入无休止的死循环:

  • 图灵不完整性:一个图灵不完整的区块链将具有有限的功能,并且不能进行jumps 和loops。因此,不会进入死循环。
  • 计步和收费表:一个程序可以简单的记录所采取的“步数”,即执行给定的步数,然后让程序停止执行。另外一种方法就是收费,首先预付一定的费用,智能合约才会执行。也就是说,每条指令执行都需要花费一定的费用。如果费用超出预付费用,智能合约就会终止。
  • 计时器:在程序中放置一个计时器。如果超出了时间限制,就可以从外部终止程序运行。

特性3:独立性

在区块链中,任何人都可以上传智能合约。但是,我们不知道是不是有人恶意上传包含错误或病毒的合约,如果智能合约不是相互独立的,一旦有人上传有病毒的智能合约,就会波及整个系统,因此,智能合约的相互独立性至关重要。

现在,我们已经完全了解智能合约的三大特性,那么智能合约应该如何执行呢?通常来说,智能合约通常使用以下两种系统执行:

  • 虚拟机:以太坊使用的就是虚拟机;
  • Docker:Fabric使用的就是Docker。

我们对两个系统做了一个比较,方便你日后根据需要使用。为了简单起见,我们来比较以太坊和Fabric。

如果你对以太坊平台上的开发感兴趣的话,比如去中心化应用程序或者是ICO游戏,Solidity语言是个不错的选择。

Solidity语言是由Gavin Wood、Christian Reitwiessner、Alex Beregszaszi、Yoichi Hirai和前以太坊核心贡献者开发的。使用Solidity语言可以在以太坊等区块链上编写智能合约。

Solidity语言非常类似于JavaScript,语法非常简单。从以太坊设计文档中,我们可以了解到一些关键信息:以太坊虚拟机(EVM)使我们能够访问程序“堆栈“,它就像一个内存空间,在这个内存空间中,我们也可以粘贴存储器地址,使程序计数器执行loop/jump控制,以太坊虚拟机需要智能合约中的完全确定性。

STEP 5:融入行业

作为一名初出茅庐的开发人员,融入区块链这一行业,并成为其中一份子,对你来说很重要。

你可以加入Reddit论坛、CSDN区块链频道、GitHub和 StackExchange,与其他开发者建立密切的联系,时刻关注区块链技术的最新进展。

时间一长,你就会了解到什么企业会寻找区块链开发人员?区块链开发人员需要具备什么技能等等。这对你提升技能,吸引招聘者的注意力真的大有裨益。

这篇文章仅仅是向你展示通往一名专业的区块链开发者的粗略规划,你要做的可不止这些,还得需要有主观能动性,坚持下去!

0 人点赞