区块链之开山利器以太坊实践笔记

快问快答,以太坊技术岗位面试终极必备题

2018-04-18  本文已影响68人  c17101422469

作者:Vitanov

来源:Medium

原文链接:https://medium.com/@i6mi6/the-ultimate-collection-of-ethereum-solidity-and-smart-contracts-interview-questions-ef610d250012

著权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文约5400字+,阅读(观看)需要31分钟


问:以太坊的价值标志是什么?

答:(ETH)

问:魏和ETH有什么区别?

答:魏是一个面额,像美分到美元或便士到磅。1 ETH =10¹⁸魏

问:以太坊的平均阻挡时间是多少?

答:14秒

问:以太坊的平均街区大小是多少?

答:大约2KB。

问:以太坊是否支持脚本?如果是这样,什么类型的脚本?

答:是的。它支持智能合同

问:你如何得到ETH?

答:有几种方法:  

 1.成为矿工

 2.交易其他货币

 3.以太网水龙头,如https://faucet.metamask.io

 4.从他人那里接收Ethers

问:ETH从哪里来?

答:在2014年预售中首次创建了6000万个。另外,在开采块时创建了ETH。

问:什么是节点?

答:一个节点本质上是一台连接到网络的计算机,它处理事务。

问:你熟悉多少个以太坊网络?

答:有三种类型的网络 - 实时网络(主),测试网络(如Ropsten和Rinkeby)和专用网络。

问:什么是与网络互动的一些方式?

答:您可以使用电子钱包或DApp

问:你可以“隐藏”一项交易吗?

答:不可以。所有交易对每个人都是可见的。

问:交易记录在哪里?

答:在公共账本上。

问:这些网络的ID是什么?

答:Live(id = 1),Ropsten(id = 3),Rinkeby(id = 4),Private(由开发人员分配)

问:所以我可以在林克比中挖掘一些Ethers并将它们转移到Live网络,对吧?

答:不,你不能在网络之间传输以太网。

问:你为什么要有私人网络?

答:有很多原因,但主要是因为数据隐私,分布式数据库,权限控制和测试。

问:您如何轻松查看有关交易和区块的详细信息?

答:使用像etherscan.io或live.ether.camp这样的区块链探索器

问:私有网络怎么样?

答:您可以使用开源浏览器客户端(如https://github.com/etherparty/explorer)

问:区块链的共识是什么?

答:遵循特定协议(如以太坊)验证交易(创建块)的过程。

问:区块链中两种常用的共识模型是什么?

答:工作证明和利益证明。

问:以简单的方式解释工作证明。

答:这实际上是矿工为了生成工作证明和验证交易而必须解决的难题。

问:以简单的方式解释股权证明。

答:该块的创建者是通过财富和年龄(股份)随机选择的。它不是计算密集型的。

问:以太坊使用什么共识模式?

答:截至2018年初,它使用工作证明,但它将切换到股权证明。

问:你怎么能用Ethers?

答:使用钱包或geth cli

问:什么是用来签署交易?

答:用户的私钥。

问:丢失私钥后你能恢复你的以太坊账户吗?

答:可以,你可以用你的12字助记符。

问:有哪些方法可以连接到节点?

答:IPC-RPC,JSON-RPC和WS-RPC。

问:那么Geth是什么?

答:Geth是以太坊cli客户端。

问:连接到geth客户端的默认方式是什么?

答:默认情况下启用IPC-RPC,每个其他RPC都被禁用。

问:你知道什么geth API?

答:Admin,eth,web3,矿工,网络,个人,调试和txpool。

问:您可以使用哪些RPC通过网络连接到geth客户端?

答:您可以使用JSON-RPC和WS-RPC通过网络连接到geth客户端。IPC-RPC只能连接到同一台机器上的geth客户端。

问:如果你通过选项 - rpc哪些RPC被启用?

答:JSON-RPC。

问:哪些RPC API默认启用?

答:eth,web3和net。

问:如何为JSON RPC启用管理API?

答:通过使用选项 - rpcapi

问:选项 - datadir有什么作用?

答:它指定了区块链的存储位置。

问:什么是geth的“快速”同步,为什么它更快?

答:与其一次处理整个区块链一个链接并重播所有发生的事务,快速同步会将事务处理回执与区块一起下载并提取整个最近的状态数据库。

问:测试网是做什么的?

答:它将客户端连接到Ropsten网络。

问:启动geth客户端会在屏幕上转储大量输出。你会如何减少噪音?

答:通过将详细程度设置为较低的数字(默认值为3)

问:如何使用IPC-RPC将一个geth客户端连接到另一个客户端?

答:首先启动一个geth客户端,复制它的管道位置,然后使用同一个datadir启动另一个geth客户端并传递 - 附加到管道位置。

问:如何将自定义javascript文件加载到geth控制台中?

答:通过传递 - 预加载和文件的路径。

问:geth客户帐户存储在哪里?

答:在密钥库目录中。

问:为了进行交易,您与账户有什么关系?

答:您必须解锁该账户 - 通过传递账户地址或索引解锁。您也可以指定一个 - 密码文件,其中所有密码都驻留在每个帐户中。

问:你提到了一些有关索引的内容。什么决定了账户指数?

答:您添加帐户的顺序。

问:是否可以使用geth挖掘?

答:是的,通过 - 我的选择。

问:什么是“etherbase”?

答:这是接收采矿奖励的帐户,它是索引0的帐户。

问:那么什么是智能合约?

答:这是用多种语言编写的计算机代码。智能合约存在于网络上。他们执行规则并执行行动,由参与者在这些合同中进行谈判。

问:智能合约可以写入哪些语言? 

答:Solidity,这是最常用的语言,Serpent和Lisp Like Language

问:智能合同用例的例子?

答:卖方 - 买方的场景,买方在智能合约中存入资金,卖方看到存款并发送货物,买方收到货物并放行付款。

问:什么是Metamask?

答:Metamask是一款可以帮助您轻松在浏览器中与以太坊网络进行互动的工具

问:Metamask使用哪个节点?

答:它使用infura.io

问:Metamask不支持什么?

答:采矿和合同部署。

问:执行合同是否免费?

答:不,调用合约方法是一个交易。

问:访问智能合同状态是否免费?

答:是的,查询状态不是交易。

问:谁执行合同?

答:矿工。

问:为什么在智能合约上调用方法会花费金钱?

答:一些方法不会修改合约的状态,也没有其他逻辑,除了返回一个值以外,都是免费的。

除了将ETH作为付款之外,调用改变国家花费的方法也是因为它们需要gas来执行。

问:更确切地说为什么会有气体?

答:由于矿工在他们的机器上执行合同代码,他们必须通过执行调用者请求的代码来承担他们的成本。

问:交易处理时,gas价格是否确定?

答:是,不是。gas价格越高,交易开采的可能性就越大。尽管如此,天然气价格并不能保证更快的交易处理。

问:交易中的gas使用量取决于什么?

答:这取决于存储量,指令的类型和数量(可选代码)。每个EVM可选代码都有一个固定数量的气体。

问:交易费是如何计算的?

答:使用的气体*gas价格(由主叫方指定)

问:如果智能合同的执行成本低于指定的gas,用户是否得到退款?

答:是的

问:如果智能合同的执行成本高于指定的天然气,会发生什么情况?

答:用户没有得到退款,并且一旦所有的气体用完并且合同没有改变,执行就会停止。

问:谁支付智能合同调用?

答:调用合同的用户。

问:节点运行智能合同代码的是什么? 

答:EVM - 以太坊虚拟机。EVM遵循作为以太坊协议一部分的EVM规范。EVM只是节点上的一个进程。

问:为了运行智能合同,EVM需要什么?

答:它需要合约的字节码,它是通过编译Solidity等更高级别的语言生成的。

问:更高级别的EVM部分有哪些?

答:内存区域,堆栈和执行引擎。

问:什么是混音?

答:开发,测试和部署合同的在线工具。快速构建和测试轻量级合同非常好,但不适合更复杂的合同。

问:在混音中,您可以连接哪些节点?

答:您可以使用Metamask,使用Geth中的本地节点以及Javascript VM中的模拟内存节点连接到公共节点。

问:什么是DApp,为什么它与普通应用程序不同?

答:应用程序通常由一个客户端与一些集中资源(由一个组织拥有)通信组成。

有一个中间层连接到一个集中的数据层。如果集中数据层中的信息丢失,则无法恢复(轻松)。

DApp表示分散式应用程序。DApps通过智能合同与网络进行交互。他们使用的数据驻留在合同实例中。

集中式数据可能比分散式更容易受到损害。

问:DApp的前端是否局限于任何技术/框架?

答:不可以。你可以使用任何你想要的东西,比如HTML,CSS,JS,Java,Python,这个名单还在继续。

问:前端用于连接后端(智能合同)的是什么?

答:Web3 API库。

问:为了与来自DApp的合同进行交互,您需要什么?

答:合同的ABI和字节码。

问:ABI用于什么?

答:ABI是DApps用于调用合同的合同的公共接口的描述。

问:什么是字节码?

答:每个节点上的EVM需要字节码才能执行合同代码。

问:为什么要使用BigNumber库?

答:因为Javascript不能正确处理大数字。

问:为什么有必要始终检查web3提供程序是否设置在Web DApp代码的开头?

答:因为Metamask注入它并用自己的覆盖其他web3。

问:为什么要使用版本web3 js 1.x而不是0.2xx?

答:主要是因为它的异步调用使用承诺而不是回调,这在javascript世界中是首选。

问:如何在web3 1.x中列出账户?

答:web3.eth.getAccounts。

问:.call和.send有什么区别?

答:.send发送交易并支付费用,而.call查询合同状态。

问:发送一个这样的以太“.send({value:1})”好吗?

答:不,你派1个。交易总是与wei一起工作。

问:所以为了发送1个乙醚,我必须将这个值减10?

答:您可以使用util方法web3.utils.toWei(1,'ether')

问:调用“.send()”时需要指定什么?

答:您必须指定“发件人”是发件人地址。其他一切都是可选的。

问:web3.eth.sendTransaction()的唯一功能是将ethers发送到特定的地址,这是否正确?

答:不,您也可以调用合约方法。

问:您是否知道以太坊的可扩展性解决方案?

答:2层协议。可能的解决方案是状态通道和血浆。

问:Solidity是静态的还是动态的?

答:它是静态类型的,这意味着类型在编译时已知。

问:与Solidity中的Java“Class”相当的功能是什么?

答:这是合同。

问:什么是合同实例?

答:合同的一个实例是区块链上已部署的合同。

问:给我一些Java和Solidity之间的区别。

答:Solidity支持多重继承,但不支持重载。

问:你必须在Solidity文件中首先指定什么?

答:Solidity编译器的版本,指定为^ 0.4.8。这是必要的,因为它可以防止在与其他版本编译时引入的不兼容性错误。

问:合同包含什么?

答:它主要由存储变量,函数和事件组成。

问:那里有哪些类型的功能?

答:有一个构造函数,回退函数,修改合同状态的常量函数和函数。

问:如果我将多个合约定义放入单个Solidity文件中,我会得到什么错误?

答:将多个合约定义放入单个Solidity文件是完全正确的。

问:两种合同可以进行交互的方式有哪些?

答:合同可以调用,创建和继承其他合同。

问:当您尝试使用多个合同部署文件时会发生什么?

答:编译器只会部署该文件中的最后一个合同,而所有其他合同都将被忽略。

问:如果我有一个庞大的项目,我需要将所有相关合同保存到一个文件中吗?

答:您可以使用导入语句导入文件,

导入“./MyOtherContracts.sol”;

问:我只能导入本地文件吗?

答:您还可以使用HTTP(甚至可以从Github)导入文件,

导入“ http://github.com/  / <回购> / <文件路径>”

问:EVM的内存分成了哪些部分?

答:它分为存储,内存和Calldata

问:解释存储

答:将其视为数据库。每个合同管理自己的存储变量。它是一个键值数据存储(256位键值)。就每次执行使用的气体而言,读取和写入成本更高。

问:解释记忆

答:这是一个临时存储。一旦执行结束,数据就会丢失。您可以像数组和结构一样分配复杂的数据类型。

问:解释卡尔达塔

答:它可以被认为是一个调用堆栈。它是临时的,不可修改的,它存储EVM执行数据。

问:哪些变量分别存储在存储区和内存区?

答:状态变量和局部变量(它们是对状态变量的引用)存储在存储器中。函数参数位于内存区域中。

问:看看下面的代码,并解释代码的哪一部分对应于哪个内存区域:

合同MyContract {

//第1部分

uint count;

uint [] totalPoints;

函数localVars(){

//第2部分

uint [] localArr;

//第3部分

uint [] memory memoryArr;

// part 4

uint [] pointer = totalPoints;

}

}

答:  

 第1部分 - 存储。 

 第2部分 - 存储(阵列大小指向相同的位置counter)

 第3部分 - 内存。

 第4部分 - 参考存储。

文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。

上一篇下一篇

猜你喜欢

热点阅读