区块链研究实验室|Ethernaut Level 0演练:ABYS,Web3以及如何使用它们

  • 时间:
  • 浏览:219
  • 来源:区块链技术网

Ethernaut的工作原理

所有智能合约源代码由以太坊虚拟机(EVM)编译为两种格式:

 

  1. 应用程序二进制接口(ABI):jSON格式的solidity和Javascript之间的通信层;

     

  2. 字节码(Bytecode):由EVM执行的低级机器语言。

当您请求为每个级别get a new instance时,Ethernaut将编译后的字节码部署到Ropsten测试网络上的一个新地址:

 

一旦在区块链上创建了这个新实例,它的地址将通过一个事件返回到您的Web客户端,如游戏的主合同ethernaut.sol所示:

 

event LevelInstanceCreatedLog(address indexed player, address instance);
  event LevelCompletedLog(address indexed player, Level level);

  function createLevelInstance(Level _levelpublic payable {

    // Ensure level is registered.
    require(registeredLevels[_level]);

    // Get level factory to create an instance.
    address instance = _level.createInstance.value(msg.value)

(msg.sender);

    // Store emitted instance relationship with player and level.
    emittedInstances[instance] = EmittedInstanceData(msg.sender,

 _level, false);

    // Retrieve created instance via logs.
    LevelInstanceCreatedLog(msg.sender, instance);
  }

最后,Web3围绕这个新的智能合约实例包装了一个ABI,并允许您通过Web控制台与合同进行交互。

 

请注意,所有“public”函数在Web客户端中都可用

 

细节演练

此级别要求您猜测密码,以便“get clear”后继续。

 

1、请注意,Ethernaut在创建合同实例时将_password传递给构造函数:

 

function Instance(string _password) public 
    password = _password; 
}

2、此密码存储为public string变量

 

string public password;

3、solidity中所有公共的基本变量类型都有一个自动生成的getter函数。这意味着您可以通过在控制台中键入以下内容直接读取这个不太机密的密码:

 

await contract.password()

您可以更轻松地使用Async/Wait来处理Web3承诺

 

4.要通过此级别,只需调用最终的authenticate 函数并通过控制台传入检索到的密码:

 

await contract.authenticate("[password here]");

您将修改authenticate函数中的存储,因此在调用此事务时需要支付一些gas费用。

 

5、最后,您应该能够再次检查是否通过了此级别:

await contract.getCleared();

关键安全要点

  1. 存储在区块链上的所有函数和变量都可供公开查看。

  2. 永远不要将密码直接存储在智能合约中。

猜你喜欢

区块链骗局曝光骗局,看看你上过当没有?

区块链骗局曝光骗局,看看你上过当没有? 随着这一波的下跌,很多人怕是过不好这个年了。 其实按道理说,从6万上方跌到5万,和从43000跌到35000跌幅差不多,但为什么大家的感受如此截然不同?

2022-01-24

从零开发区块链应用(一)-golang配置文件管理工具viper

理解 HTTP 构建的网络应用只要关注两个端--客户端(client)和服务端(server),两个端的交互来自 client 的 request,以及 server 端的 response。所谓的 http 服务器,主要在于如何接受 client 的 request,并向 client 返回 response

2022-01-20

从零开发区块链应用(二)--mysql安装及数据库表的安装创建

varchar 类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取 0~~65525 之间的任意值。指定了 varchar 类型的最大值以后,其长度可以在 o 到最大长度之间。

2022-01-20

从零开发区块链应用(三)--mysql初始化及gorm框架使用

Gorm 是 golang 的一个 orm 框架,它提供了对数据库操作的封装,使用起来相当便利。所以如果对 mysql 使用操作不熟悉,建议也可以使用 gorm 框架操作 mysql 数据库。

2022-01-20

从零开发区块链应用(四)--自定义业务错误信息

在实际业务开发中,一个条错误信息需要包含两部分内容:直接展示给用户的 message 和用于开发人员 debug 的 error 。message 可能会直接展示给用户,error 是用于 debug 的错误信息,可能包含敏感/内部信息,不宜对外展示

2022-01-20