eth博士面试(干货,某区块链初创公司面试题)

  eth博士面试(干货,某区块链初创公司面试题)

最近去面试了某区块链公司,是一个做区块链底层平台的公司,核心成员大多来自BAT等一线互联网企业。这也是从安卓开发转型到区块链的第一次尝试,更恰当的说是一次难得的学习和积累经验的机会。这里写篇文章来和大家分享一下,看看一个做底层区块链平台的公司会侧重于哪些方面的能力。

  

问项目

一上来首先是问项目,因为笔者一直是做安卓开发,所以区块链这块的项目经验为0。不过面试官看的出来对安卓也有一点了解,他的问题总体来说比较常规,都是平常面试多半会被问到的问题,列举一下:

  

(1) 项目中有挑战的技术难点是什么,具体展开说说;

  

(2) 与团队中的其他成员相比,你觉得你的优势在哪里;

  

(3) 处理过项目中的哪些难点问题,具体是如何解决的;

  

这些问题基本上都是任何面试都会被问到的问题,面试官从这些问题中能或多或少的了解到你对所参与的项目的整体的理解和你具备的技术能力,问题虽然常规,但是建议面试之前还是端一杯茶放到桌前,然后闭上眼睛静静的思考一番,捋一捋自己的项目,这样面试的时候能多一份从容。

  

区块链

项目问过之后,就切入正题来到区块链了,这里笔者把问到的区块链问题整理一下,供大家参考。

  

问:区块链中涉及到哪些密码学算法?

  

对区块链稍有了解的同学都知道,密码学算法是区块链底层用到的核心技术之一,问这个问题应该是早有预料。但是当时回答的时候答的并不是很理想,只说了非对称加密、数字签名、hash。实际上零知识证明、bloom filter、merkel树等也都属于密码学算法,应该都说出来会更好。

  

问:数字签名的过程

  

这个问题是对上一个问题的延伸,既然你在回答中提到了数字签名,那作为区块链底层的一个核心算法,这个问题算是顺手牵羊。现在想来,这个问题自己回答的并不好,当时是想结合比特币交易的签名和验证来讲,但是因为紧张和太急,反倒回答的没有条理,没能讲清楚。正确的姿势应该是先讲数字签名的原理,然后在结合比特币交易签名和验证的过程讲一讲数字签名在区块链中的实际应用。

  

问:解释一下交易的签名和验证过程

  

这个问题好回答又不好回答,如果准备的好,就能有条理的讲出来,如果准备的不好,就很容易讲乱,把自己讲乱的同时也让面试官一头雾水。可以结合比特币的交易签名和验证过程细讲,以比特币区块链为例,以下是笔者整理的一份比较有条理的参考答案:

  

  

(1) 假设有一笔A->;B的转账交易T0,则交易T中存在若干输入和若干输出,假设交易输出中的O指向B的钱包地址;

  

(2) A会在输出O上设定一个锁定脚本,该锁定脚本的作用是确保这笔钱在将来只有B能支配,具体的锁定脚本视采用的交易类型,比如P2PKH、P2SH、多重签名等等,以P2PKH为例,A将B的公钥写入锁定脚本并在锁定脚本中加入校验签名这个条件;

  

(3) 随后B要花费A转给他的这笔钱,设该交易为T1,则T0为交易T1的前置交易,再假设T1的输入I指向了T0的输出O。

  

(4) B需要向社区的其他人证明它确实有权利支配这笔钱,证明的办法就是用数字签名技术:B对交易T1进行hash生成交易摘要,然后用自己的私钥对交易摘要进行签名,然后将该签名写入到交易T1的输入I的解锁脚本中;最后B将交易T1广播给其他节点;

  

(5)其他节点收到了B广播的交易T1,于是要进行种种校验,其中包括对签名的校验。具体验证过程是:先找到接收到的交易T1的输入I指向的输出(即前置交易T0的输出O)对应的锁定脚本,然后用锁定脚本中指定的公钥解密交易输入I中的签名得到一个交易hash值,最后验证者自己对交易进行hash,二者一对比,如果相同就能证明B是这笔钱的拥有者。

  

这一块的逻辑有点绕,因此建议准备面试的同学最好事先准备一下,不然很有可能把自己也绕到里面最后讲成一团乱麻。

  

问:公钥和私钥是什么关系?

  

这个问题比较简单:私钥通过随机数算法获得,而公钥一般通过私钥来生成,而比特币的钱包地址则是将公钥在进行一次hash后获得。

  

问:讲一讲PoW的原理

  

这个问题涉及到了区块链中另外一个核心知识点:共识算法。当时回答的时候是结合比特币中的实现来讲的,最好是在回答中能尽量全面一些,以比特币中的PoW为例:

  

(1) 区块头中有一个表示难度的值,该值是一个32位的整数,这个整数会被解释为一个指数级的难度求值公式:8位为指数的一部分,24位为系数。根据公式就能求得一个很大的数值V;

  

(2) 区块头中有一个nounce值,节点会不断的递增该nounce值计算区块头的hash,看得到的hash值是否小于等于V,如果成立则完成工作量证明;

  

(3) 难度值V越小难度越大;难度值由系统动态调整,具体是以平均10分钟一个区块的速度为基准,根据过去2016个区块的总时间是否超过2016 * 10,超过了表示难度太高,会降低难度,没超过说明难度低了,提高难度。

  

问:讲一讲PBFT算法流程

  

依然是共识算法,这个就按平常学习到的来讲了,主要要讲清楚PBFT三阶段(preprepare、prepare、commit),视图切换,高低水位这些主要该概念。另外PBFT中高低水位的概念自己也没怎么弄清楚,比特币购买所以老实的给面试官交待了。

  

问:为什么有些区块链用的是PoW共识算法,有的区块链又用PBFT算法,它们的区别在哪里?

  

这个是真心不知道,于是就问了面试官,面试官告诉我说PBFT主要用在联盟链中,而PoW主要用在公链上。

  

问:你觉得从安全的角度而言,智能合约存在哪些潜在的安全问题?

  

这个问题也是不太明白,因为记得有一次看过一篇文章讲过因为智能合约代码的漏洞导致用户损失大量eth的案例,所以就回答说智能合约代码可能存在漏洞被攻击者利用。然后面试官又问以太坊最近出的一些安全事件是否了解,知不知道solidity本身是开源的。总之通过这个问题面试官就能了解到你对区块链的关注度,对区块链安全方面是否有一定了解。这一块基本上是一片空白区,是后续需要补全的一个知识点。

  

问:你觉得木马和区块链能不能结合?

  

听到这个问题的时候一脸闷逼,完全没想过这二者能擦出什么样的火花。想了半天然后对面试官说:不知道。面试官笑了笑说:我是自由发挥随便问问。如果读者对这个问题有独到见解,欢迎在评论区留言指导一下。

  

问:说一说区块链中是如何发现节点的?

  

这个问题涉及到了P2P网络,对于比特币而言,因为系统已经内置了一些种子节点,可以连接这些种子节点然后获取网络中其他节点的地址,另外在比特币客户端启动的时候,也可以通过一些选项来指定peer的地址并连接。不知道这个回答是否全面。

  

问:比特币节点的地址是如何扩散的,用了什么算法?

  

老实讲自己也只是结合《精通比特币》里相关内容大致过了一下源码,只知道节点连接到peer以后会通过ADDR协议将自己的本地地址发送给peer,然后peer又将这些地址再扩散给自己相邻的节点。但是面试官告诉我说这种地址的扩散都是有算法的,具体什么算法他没有明说,可见在自己的知识图谱中分布式算法这块也是存在巨大缺失的。

  

总结

通过面试,其实可以看到区块链学习过程中应该关注技术点,这些点很可能会被一些做区块链底层开发的公司问到:

  

(1) 密码学算法:像非对称加密,数字签名这些基本算法是必须掌握的,另外向零知识证明、merkel树、bloom filter等在区块链中实际用到算法也都需要掌握好,一个不小心就可能被问到;

  

(2) 共识算法:这个不用说了,PoW、PBFT、PoS、DPoS估计是逮谁问谁,最好是能结合源代码学习,PoW可以看比特币或以太坊,PBFT可以看Farbric;

  

(3) 区块链安全:区块链本身的安全性也是很重要的一块,毕竟区块链和金融、物联网等领域能够较好的结合,而这些领域对于安全性都是有很强的要求,所以需要在平时多关注一些安全事件以及这些事件发生的来龙去脉,另外有一本专门将区块链安全相关的书籍《区块链安全技术指南》,打算啃一啃。

  

(4) 分布式相关:区块链本身就是建立在分布式网络上的账本,因此分布式相关的算法也是需要了解的。

  

总之感觉这次面试基本上区块链里比较核心的一些东西都被问到了,也从侧面说明这类做底层区块链平台的项目对技术能力的要求,看来想转入区块链尚有许多需要学习的知识。另外目前关于区块链相关的面试题目,网上的资源相对而言比较少,本文将面试经历分享出来,供有志于从事区块链开发的同学一起学习。

  

对区块链有兴趣的同学也可以+关注,一起学习,一起进步。

  
","content_hash"!"b4925d80

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论