区块链magicnumber

本文详细介绍了如何通过编写包含10个opcode的智能合约来完成一项挑战,该合约在执行后返回42。解题过程涉及MSTORE和RETURN指令的使用,以及合约部署时的CODECOPY和RETURN指令。最终,将初始化和运行时代码组合,形成满足条件的合约bytecode。

在这里插入图片描述

通关条件

部署一个只有 10 个 opcode 的合约,该合约在调用后返回 42
题目合约

pragma solidity ^0.5.0;
 
contract MagicNum {
 
  address public solver;
 
  constructor() public {}
 
  function setSolver(address _solver) public {
    solver = _solver;
  }
 
  /*
    ____________/\\\_______/\\\\\\\\\_____
     __________/\\\\\_____/\\\///\\\___
      ________/\\\/\\\____\///______\//\\\__
       ______/\\\/\/\\\______________/\\\/___
        ____/\\\/__\/\\\___________/\\\//_____
         __/\\\\\\\\\\\\\\\\_____/\\\//________
          _\///\\\//____/\\\/___________
           ___________\/\\\_____/\\\\\\\\\\\\\\\_
            ___________\///_____\///__
  */
}

解题过程

创建合约的交易的 bytecode 主要由初始化代码和运行时代码两部分组成。初始化代码用于创建合约,并存储运行时代码;运行时代码则是合约的实际逻辑。

首先考虑运行时代码。我们需要将 42(0x2A)存放到内存中,再返回给调用者。第一个步骤需要使用 MSTORE(0x52,用于将一个 (u)int256 写入内存,0x52),第二个步骤需要使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值