以太坊开发人员最常用到的面试问题——简单篇,如回答有误请评论区指正,谢谢简单题私有、内部、公共和外部函数之间的区别?private(私有):只能在合约内部被调用,不能被合约外部或继承的合约调用。internal(内部):与private类似,但也可以在继承该合约的合约中被调
<!--StartFragment-->
以太坊开发人员最常用到的面试问题——简单篇,如回答有误请评论区指正,谢谢
<!--StartFragment-->
私有、内部、公共和外部函数之间的区别?
智能合约大小大约可以有多大?
create 和 create2 之间有什么区别?
keccak256(rlp.encode(deployingAddress, nonce))
。keccak256(0xff ++ deployingAddr ++ salt ++ keccak256(bytecode))
。create2 的优点是可以在部署合约之前预测合约地址。Solidity 0.8.0 版本对算术运算有什么重大变化?
代理需要哪种特殊的 CALL 才能工作?
delegatecall
特殊的 CALL 才能工作。delegatecall
允许在主合约的上下文中加载和调用另一个合约的代码,被调用合约的代码被执行,但被调用合约所做的任何状态改变实际上是在主合约的存储中进行的,而不是在被调用合约的存储中。在 EIP-1559 之前,如何计算以太坊交易的美元成本?
在区块链上创建随机数的挑战是什么?
荷兰式拍卖和英式拍卖之间有什么区别?
ERC20 中的 transfer 和 transferFrom 之间有什么区别?
对于地址 allowlist,使用映射还是数组更好?为什么? * 映射(mapping) 更好。映射可以快速检查一个地址是否在 allowlist 中,时间复杂度为 O(1),而数组需要遍历整个数组来查找地址,时间复杂度为 O(n)。此外,映射还可以方便地添加和删除地址,而数组的操作则相对复杂。
为什么不应该使用 tx.origin 进行身份验证?
* tx.origin
表示交易的发起者地址,但它不能用于身份验证,因为它可以被中间人(如钱包或交易所)篡改。例如,当用户通过钱包发送交易时,tx.origin
可能是钱包的地址,而不是用户的真实地址。因此,应该使用msg.sender
来进行身份验证,它表示当前合约的调用者地址。
以太坊主要使用什么哈希函数? * 以太坊主要使用 Keccak-256 哈希函数。
1 个 Ether 相当于 多少个 gwei? * 1 个 Ether 相当于 10^9 个 gwei。
1 个 Ether 相当于 多少个 wei? * 1 个 Ether 相当于 10^18 个 wei。
assert 和 require 之间有什么区别? * assert :用于检查函数内部的不变量,如果检查失败,会抛出一个异常,并回滚所有状态变化。它主要用于检查函数的逻辑错误,如溢出、下溢等。 * require :用于检查函数的前置条件,如果检查失败,会抛出一个异常,并回滚所有状态变化。它主要用于检查函数的输入参数、权限等。
什么是闪电贷? * 闪电贷是一种允许用户在不需要抵押的情况下,从去中心化金融(DeFi)协议中借入大量资金,并在同一个交易中偿还的贷款方式。闪电贷的特点是快速、无需抵押,但需要在同一个交易中完成借入和偿还,否则交易会失败。
什么是检查效果(check-effects)模式? * 检查效果(check-effects)模式是一种智能合约的设计模式,用于防止重入攻击。在这种模式下,合约首先检查调用者的权限和状态,然后执行合约的逻辑,最后更新合约的状态。这样可以确保在合约执行过程中,状态的更新是安全的,不会被重入攻击所利用。
运行独立验证节点所需的最小以太数量是多少? * 运行独立验证节点所需的最小以太数量取决于节点的硬件配置、网络带宽等因素。一般来说,运行一个独立验证节点需要至少 1 个以太左右。
fallback 和 receive 之间有什么区别? * fallback :是一个特殊的函数,当合约接收到没有指定函数的交易时会被调用。它可以在合约中定义,也可以不定义。如果定义了 fallback 函数,它会在合约接收到交易时被调用,否则合约会拒绝交易。 * receive :是一个特殊的函数,用于接收以太。它只能在合约中定义,当合约接收到以太时会被调用。receive 函数不能接收任何参数,也不能返回任何值。
什么是重入? * 重入是指在智能合约执行过程中,被调用的外部合约再次调用当前合约的函数,导致当前合约的状态被多次修改。重入攻击是一种常见的智能合约安全漏洞,攻击者可以利用重入攻击窃取合约中的资金或篡改合约的状态。
上海升级后,每个区块的 gas 限制是多少? * 上海升级后,每个区块的 gas 限制为 3000 万 gas。
什么阻止无限循环永远运行? * 无限循环在智能合约中是被阻止的,因为智能合约的执行需要消耗 gas,而 gas 是有限的。如果智能合约中存在无限循环,它会消耗大量的 gas,导致交易失败。此外,智能合约的编译器也会在编译时检查是否存在无限循环,如果存在,会报错并阻止合约的部署。
tx.origin 和 msg.sender 之间有什么区别?
* tx.origin :表示交易的发起者地址,它可以是用户地址、合约地址或中间人(如钱包或交易所)地址。tx.origin
可以被中间人篡改,因此不能用于身份验证。
* msg.sender :表示当前合约的调用者地址,它可以是用户地址或合约地址。msg.sender
不能被中间人篡改,因此可以用于身份验证。
如何向没有 payable 函数、receive 或回退的合约发送以太?
* 如果一个合约没有payable
函数、receive
函数或回退函数,那么不能直接向该合约发送以太。如果尝试向该合约发送以太,交易会失败。
view 和 pure 之间有什么区别?
* view :表示该函数不会修改合约的状态,可以被外部调用。view
函数可以读取合约的状态变量,但不能修改它们。 * pure :表示该函数不会读取或修改合约的状态,可以被外部调用。pure
函数不能读取合约的状态变量,也不能修改它们。
ERC721 中的 transferFrom 和 safeTransferFrom 之间有什么区别? * transferFrom :用于从一个地址向另一个地址转移 ERC721 代币,但不会检查接收方是否支持 ERC721 接收器接口。 * safeTransferFrom :用于从一个地址向另一个地址转移 ERC721 代币,并会检查接收方是否支持 ERC721 接收器接口。如果接收方不支持该接口,转移会失败。
如何将 ERC1155 代币转换为非同质化代币?
* 将 ERC1155 代币转换为非同质化代币(NFT)需要创建一个新的 NFT 合约,并将 ERC1155 代币的所有权转移到该 NFT 合约中。具体步骤如下:
* 创建一个新的 NFT 合约,该合约应遵循 ERC721 或其他 NFT 标准。
* 在 ERC1155 合约中,调用safeTransferFrom
函数将 ERC1155 代币的所有权转移到新的 NFT 合约中。
* 在新的 NFT 合约中,调用mint
函数创建一个新的 NFT,并将该 NFT 的所有权分配给 ERC1155 代币的原所有者。
访问控制是什么,为什么重要? * 访问控制是指对智能合约的函数和数据的访问权限进行限制,以确保只有授权的用户或合约可以访问或修改它们。访问控制非常重要,因为它可以防止未经授权的用户或合约对智能合约进行恶意操作,如窃取资金、篡改数据等。
修饰符(modifier)的作用是什么?
* 修饰符(modifier)是一种用于修改函数行为的特殊函数,可以在函数执行前后插入额外的逻辑。修饰符通常用于添加访问控制、状态验证等功能。例如,onlyOwner
修饰符可以确保只有合约的所有者可以调用某些函数。
uint256 可以存储的最大值是多少?
* uint256
可以存储的最大值是 2^256 - 1。
什么是浮动利率和固定利率? * 浮动利率 :是指利率会根据市场条件或其他因素的变化而变化。浮动利率通常用于贷款、债券等金融产品中,利率会根据基准利率或其他参考利率的变化而调整。 * 固定利率 :是指利率在一定时期内保持不变。固定利率通常用于贷款、债券等金融产品中,利率在产品存续期间不会变化。 <!--EndFragment--> <!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!