solidity icon indicating copy to clipboard operation
solidity copied to clipboard

Unknown EVM memory space while function returns a memory array.

Open UpbeatDylan opened this issue 1 year ago • 1 comments

I have a contract like the following shows:

pragma solidity ^0.8.18;

contract Model {
    // Model parameter updates received in a round
    int32[480] weights;

    // 构造函数,只在合约部署时调用一次
    constructor() {
        // 在构造函数中初始化合约拥有者
        for (uint32 i = 0; i < 480; i++) {
            weights[i] = int32(i);
        }
    }

    // Download aggregated updates
    function download(uint32 start) public view returns (int32[8] memory) {
        int32[8] memory vs;

        for (uint256 i = 0; i < 8; i++) {
            vs[i] = weights[start + i];
        }
        return vs;
    }
}

When I use the remix to check the memory of EVM and the workflow of opcodes. I found that the structure of the allocated memory space is like this : image image image

My insights: the workflow of opcodes SLOAD the target value and stores it into the space of array vs in memory. And when vs complete reading, a loop copies the vs memory value to return value space in memory (which is returned to the user).

Questions:

  1. Why is a CODECOPY opcode copying from the same source into 0x80 ~ 0x180 and 0x180 ~ 0x280 ? Does CODECOPY work like giving arrays an initial value? I originally thought that CODECOPY would only be called when the contract is created.

  2. What is 0x80~0x180 used for? After CODECOPY, I have not seen this memory space being used. And the length of this space is the same as the length of the array space. What is the actual purpose of this space?

  3. Why, after the 'vs' array has been assigned values, is it necessary to copy the values of the 'vs' array to a new memory space before returning it to the caller?

I am eagerly looking forward to your reply! I am very grateful for your assistance. From a loyal developer.

ASSEMBLY:

.code
  PUSH 80			contract Model {\n    // Model...
  PUSH 40			contract Model {\n    // Model...
  MSTORE 			contract Model {\n    // Model...
  CALLVALUE 			中初始化合约拥有者\n        for (uint32...
  DUP1 			中初始化合约拥有者\n        for (uint32...
  ISZERO 			中初始化合约拥有者\n        for (uint32...
  PUSH [tag] 1			中初始化合约拥有者\n        for (uint32...
  JUMPI 			中初始化合约拥有者\n        for (uint32...
  PUSH 0			中初始化合约拥有者\n        for (uint32...
  DUP1 			中初始化合约拥有者\n        for (uint32...
  REVERT 			中初始化合约拥有者\n        for (uint32...
tag 1			中初始化合约拥有者\n        for (uint32...
  JUMPDEST 			中初始化合约拥有者\n        for (uint32...
  POP 			中初始化合约拥有者\n        for (uint32...
  PUSH 0			(i);\n   
tag 4			int32(i);\n        }\n    }\n\...
  JUMPDEST 			int32(i);\n        }\n    }\n\...
  PUSH 1E0			 }\n
  DUP2 			\n
  PUSH FFFFFFFF			\n    }\n
  AND 			\n    }\n
  LT 			\n    }\n
  ISZERO 			int32(i);\n        }\n    }\n\...
  PUSH [tag] 5			int32(i);\n        }\n    }\n\...
  JUMPI 			int32(i);\n        }\n    }\n\...
  DUP1 			f
  PUSH 0			egated 
  DUP3 			p
  PUSH FFFFFFFF			egated upd
  AND 			egated upd
  PUSH 1E0			egated upd
  DUP2 			egated upd
  LT 			egated upd
  PUSH [tag] 7			egated upd
  JUMPI 			egated upd
  PUSH [tag] 8			egated upd
  PUSH [tag] 9			egated upd
  JUMP 			egated upd
tag 8			egated upd
  JUMPDEST 			egated upd
tag 7			egated upd
  JUMPDEST 			egated upd
  PUSH 8			egated upd
  SWAP2 			egated upd
  DUP3 			egated upd
  DUP3 			egated upd
  DIV 			egated upd
  ADD 			egated upd
  SWAP2 			egated upd
  SWAP1 			egated upd
  MOD 			egated upd
  PUSH 4			egated upd
  MUL 			egated upd
  PUSH 100			egated updates\n    fu
  EXP 			egated updates\n    fu
  DUP2 			egated updates\n    fu
  SLOAD 			egated updates\n    fu
  DUP2 			egated updates\n    fu
  PUSH FFFFFFFF			egated updates\n    fu
  MUL 			egated updates\n    fu
  NOT 			egated updates\n    fu
  AND 			egated updates\n    fu
  SWAP1 			egated updates\n    fu
  DUP4 			egated updates\n    fu
  PUSH 3			egated updates\n    fu
  SIGNEXTEND 			egated updates\n    fu
  PUSH FFFFFFFF			egated updates\n    fu
  AND 			egated updates\n    fu
  MUL 			egated updates\n    fu
  OR 			egated updates\n    fu
  SWAP1 			egated updates\n    fu
  SSTORE 			egated updates\n    fu
  POP 			egated updates\n    fu
  DUP1 			   
  DUP1 			   
  PUSH 1			   
  ADD 			   
  SWAP2 			   
  POP 			   
  POP 			   
  PUSH [tag] 4			int32(i);\n        }\n    }\n\...
  JUMP 			int32(i);\n        }\n    }\n\...
tag 5			int32(i);\n        }\n    }\n\...
  JUMPDEST 			int32(i);\n        }\n    }\n\...
  POP 			int32(i);\n        }\n    }\n\...
  PUSH [tag] 11			contract Model {\n    // Model...
  JUMP 			contract Model {\n    // Model...
tag 9			solidity ^0.8.18;\n\ncontract ...
  JUMPDEST 			solidity ^0.8.18;\n\ncontract ...
  PUSH 4E487B7100000000000000000000000000000000000000000000000000000000			 parameter updates received in...
  PUSH 0			d
  MSTORE 			  // Model parameter updates r...
  PUSH 32			ruct
  PUSH 4			n
  MSTORE 			\n    constructo
  PUSH 24			造函数中
  PUSH 0			 
  REVERT 			     // 在构造函数中初
tag 11			contract Model {\n    // Model...
  JUMPDEST 			contract Model {\n    // Model...
  PUSH #[$] 0000000000000000000000000000000000000000000000000000000000000000			contract Model {\n    // Model...
  DUP1 			contract Model {\n    // Model...
  PUSH [$] 0000000000000000000000000000000000000000000000000000000000000000			contract Model {\n    // Model...
  PUSH 0			contract Model {\n    // Model...
  CODECOPY 			contract Model {\n    // Model...
  PUSH 0			contract Model {\n    // Model...
  RETURN 			contract Model {\n    // Model...
.data
  0:
    .code
      PUSH 80			contract Model {\n    // Model...
      PUSH 40			contract Model {\n    // Model...
      MSTORE 			contract Model {\n    // Model...
      CALLVALUE 			contract Model {\n    // Model...
      DUP1 			contract Model {\n    // Model...
      ISZERO 			contract Model {\n    // Model...
      PUSH [tag] 1			contract Model {\n    // Model...
      JUMPI 			contract Model {\n    // Model...
      PUSH 0			contract Model {\n    // Model...
      DUP1 			contract Model {\n    // Model...
      REVERT 			contract Model {\n    // Model...
    tag 1			contract Model {\n    // Model...
      JUMPDEST 			contract Model {\n    // Model...
      POP 			contract Model {\n    // Model...
      PUSH 4			contract Model {\n    // Model...
      CALLDATASIZE 			contract Model {\n    // Model...
      LT 			contract Model {\n    // Model...
      PUSH [tag] 2			contract Model {\n    // Model...
      JUMPI 			contract Model {\n    // Model...
      PUSH 0			contract Model {\n    // Model...
      CALLDATALOAD 			contract Model {\n    // Model...
      PUSH E0			contract Model {\n    // Model...
      SHR 			contract Model {\n    // Model...
      DUP1 			contract Model {\n    // Model...
      PUSH 1B3562B6			contract Model {\n    // Model...
      EQ 			contract Model {\n    // Model...
      PUSH [tag] 3			contract Model {\n    // Model...
      JUMPI 			contract Model {\n    // Model...
    tag 2			contract Model {\n    // Model...
      JUMPDEST 			contract Model {\n    // Model...
      PUSH 0			contract Model {\n    // Model...
      DUP1 			contract Model {\n    // Model...
      REVERT 			contract Model {\n    // Model...
    tag 3			] memory) {\n        int32[8] ...
      JUMPDEST 			] memory) {\n        int32[8] ...
      PUSH [tag] 4			] memory) {\n        int32[8] ...
      PUSH 4			] memory) {\n        int32[8] ...
      DUP1 			] memory) {\n        int32[8] ...
      CALLDATASIZE 			] memory) {\n        int32[8] ...
      SUB 			] memory) {\n        int32[8] ...
      DUP2 			] memory) {\n        int32[8] ...
      ADD 			] memory) {\n        int32[8] ...
      SWAP1 			] memory) {\n        int32[8] ...
      PUSH [tag] 5			] memory) {\n        int32[8] ...
      SWAP2 			] memory) {\n        int32[8] ...
      SWAP1 			] memory) {\n        int32[8] ...
      PUSH [tag] 6			] memory) {\n        int32[8] ...
      JUMP 			] memory) {\n        int32[8] ...
    tag 5			] memory) {\n        int32[8] ...
      JUMPDEST 			] memory) {\n        int32[8] ...
      PUSH [tag] 7			] memory) {\n        int32[8] ...
      JUMP 			] memory) {\n        int32[8] ...
    tag 4			] memory) {\n        int32[8] ...
      JUMPDEST 			] memory) {\n        int32[8] ...
      PUSH 40			] memory) {\n        int32[8] ...
      MLOAD 			] memory) {\n        int32[8] ...
      PUSH [tag] 8			] memory) {\n        int32[8] ...
      SWAP2 			] memory) {\n        int32[8] ...
      SWAP1 			] memory) {\n        int32[8] ...
      PUSH [tag] 9			] memory) {\n        int32[8] ...
      JUMP 			] memory) {\n        int32[8] ...
    tag 8			] memory) {\n        int32[8] ...
      JUMPDEST 			] memory) {\n        int32[8] ...
      PUSH 40			] memory) {\n        int32[8] ...
      MLOAD 			] memory) {\n        int32[8] ...
      DUP1 			] memory) {\n        int32[8] ...
      SWAP2 			] memory) {\n        int32[8] ...
      SUB 			] memory) {\n        int32[8] ...
      SWAP1 			] memory) {\n        int32[8] ...
      RETURN 			] memory) {\n        int32[8] ...
    tag 7			] memory) {\n        int32[8] ...
      JUMPDEST 			] memory) {\n        int32[8] ...
      PUSH [tag] 10			(uint256 i = 0;
      PUSH [tag] 11			(uint256 i = 0;
      JUMP 			(uint256 i = 0;
    tag 10			(uint256 i = 0;
      JUMPDEST 			(uint256 i = 0;
      PUSH [tag] 13			 {\n            vs[
      PUSH [tag] 11			 {\n            vs[
      JUMP 			 {\n            vs[
    tag 13			 {\n            vs[
      JUMPDEST 			 {\n            vs[
      PUSH 0			rt + i];\n
    tag 14			s[start + i];\n        }\n    ...
      JUMPDEST 			s[start + i];\n        }\n    ...
      PUSH 8			 
      DUP2 			 
      LT 			  }\n 
      ISZERO 			s[start + i];\n        }\n    ...
      PUSH [tag] 15			s[start + i];\n        }\n    ...
      JUMPI 			s[start + i];\n        }\n    ...
      PUSH 0			
      DUP2 			
      DUP6 			
      PUSH FFFFFFFF			
      AND 			
      PUSH [tag] 17			
      SWAP2 			
      SWAP1 			
      PUSH [tag] 18			
      JUMP 			
    tag 17			
      JUMPDEST 			
      PUSH 1E0			
      DUP2 			
      LT 			
      PUSH [tag] 19			
      JUMPI 			
      PUSH [tag] 20			
      PUSH [tag] 21			
      JUMP 			
    tag 20			
      JUMPDEST 			
    tag 19			
      JUMPDEST 			
      PUSH 8			
      SWAP2 			
      DUP3 			
      DUP3 			
      DIV 			
      ADD 			
      SWAP2 			
      SWAP1 			
      MOD 			
      PUSH 4			
      MUL 			
      SWAP1 			
      SLOAD 			
      SWAP1 			
      PUSH 100			
      EXP 			
      SWAP1 			
      DIV 			
      PUSH 3			
      SIGNEXTEND 			
      DUP3 			 }
      DUP3 			}
      PUSH 8			 }\n}\n
      DUP2 			 }\n}\n
      LT 			 }\n}\n
      PUSH [tag] 23			 }\n}\n
      JUMPI 			 }\n}\n
      PUSH [tag] 24			 }\n}\n
      PUSH [tag] 21			 }\n}\n
      JUMP 			 }\n}\n
    tag 24			 }\n}\n
      JUMPDEST 			 }\n}\n
    tag 23			 }\n}\n
      JUMPDEST 			 }\n}\n
      PUSH 20			 }\n}\n
      MUL 			 }\n}\n
      ADD 			 }\n}\n
      SWAP1 			 }\n}\n
      PUSH 3			 }\n}\n
      SIGNEXTEND 			 }\n}\n
      SWAP1 			 }\n}\n
      DUP2 			 }\n}\n
      PUSH 3			 }\n}\n
      SIGNEXTEND 			 }\n}\n
      DUP2 			 }\n}\n
      MSTORE 			 }\n}\n
      POP 			 }\n}\n
      POP 			 }\n}\n
      DUP1 			   
      DUP1 			   
      PUSH 1			   
      ADD 			   
      SWAP2 			   
      POP 			   
      POP 			   
      PUSH [tag] 14			s[start + i];\n        }\n    ...
      JUMP 			s[start + i];\n        }\n    ...
    tag 15			s[start + i];\n        }\n    ...
      JUMPDEST 			s[start + i];\n        }\n    ...
      POP 			s[start + i];\n        }\n    ...
      DUP1 			
      SWAP2 			
      POP 			
      POP 			
      SWAP2 			] memory) {\n        int32[8] ...
      SWAP1 			] memory) {\n        int32[8] ...
      POP 			] memory) {\n        int32[8] ...
      JUMP 			] memory) {\n        int32[8] ...
    tag 11			
      JUMPDEST 			
      PUSH 40			
      MLOAD 			
      DUP1 			
      PUSH 100			
      ADD 			
      PUSH 40			
      MSTORE 			
      DUP1 			
      PUSH 8			
      SWAP1 			
      PUSH 20			
      DUP3 			
      MUL 			
      DUP1 			
      CALLDATASIZE 			
      DUP4 			
      CALLDATACOPY 			
      DUP1 			
      DUP3 			
      ADD 			
      SWAP2 			
      POP 			
      POP 			
      SWAP1 			
      POP 			
      POP 			
      SWAP1 			
      JUMP 			
    tag 26			round\n    int32[480] weights;...
      JUMPDEST 			round\n    int32[480] weights;...
      PUSH 0			f
      DUP1 			 
      REVERT 			者\n        fo
    tag 28			wnload(uint32 start) public vi...
      JUMPDEST 			wnload(uint32 start) public vi...
      PUSH 0			urns (i
      PUSH FFFFFFFF			] memory v
      DUP3 			int32
      AND 			    int32[8] memory vs
      SWAP1 			ory) {\n        int32[8] memor...
      POP 			ory) {\n        int32[8] memor...
      SWAP2 			wnload(uint32 start) public vi...
      SWAP1 			wnload(uint32 start) public vi...
      POP 			wnload(uint32 start) public vi...
      JUMP 			wnload(uint32 start) public vi...
    tag 29			or (uint256 i = 0; i < 8; i++)...
      JUMPDEST 			or (uint256 i = 0; i < 8; i++)...
      PUSH [tag] 47			\n        }\n        retu
      DUP2 			  ret
      PUSH [tag] 28			\n        }\n        retu
      JUMP 			\n        }\n        retu
    tag 47			\n        }\n        retu
      JUMPDEST 			\n        }\n        retu
      DUP2 			t + i
      EQ 			tart + i];\n        }\n       ...
      PUSH [tag] 48			 weights[start + i];\n        ...
      JUMPI 			 weights[start + i];\n        ...
      PUSH 0			
      DUP1 			\n
      REVERT 			;\n    }\n}\n
    tag 48			 weights[start + i];\n        ...
      JUMPDEST 			 weights[start + i];\n        ...
      POP 			or (uint256 i = 0; i < 8; i++)...
      JUMP 			or (uint256 i = 0; i < 8; i++)...
    tag 30			
      JUMPDEST 			
      PUSH 0			
      DUP2 			
      CALLDATALOAD 			
      SWAP1 			
      POP 			
      PUSH [tag] 50			
      DUP2 			
      PUSH [tag] 29			
      JUMP 			
    tag 50			
      JUMPDEST 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 6			
      JUMPDEST 			
      PUSH 0			
      PUSH 20			
      DUP3 			
      DUP5 			
      SUB 			
      SLT 			
      ISZERO 			
      PUSH [tag] 52			
      JUMPI 			
      PUSH [tag] 53			
      PUSH [tag] 26			
      JUMP 			
    tag 53			
      JUMPDEST 			
    tag 52			
      JUMPDEST 			
      PUSH 0			
      PUSH [tag] 54			
      DUP5 			
      DUP3 			
      DUP6 			
      ADD 			
      PUSH [tag] 30			
      JUMP 			
    tag 54			
      JUMPDEST 			
      SWAP2 			
      POP 			
      POP 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 31			
      JUMPDEST 			
      PUSH 0			
      PUSH 8			
      SWAP1 			
      POP 			
      SWAP2 			
      SWAP1 			
      POP 			
      JUMP 			
    tag 32			
      JUMPDEST 			
      PUSH 0			
      DUP2 			
      SWAP1 			
      POP 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 33			
      JUMPDEST 			
      PUSH 0			
      DUP2 			
      SWAP1 			
      POP 			
      SWAP2 			
      SWAP1 			
      POP 			
      JUMP 			
    tag 34			
      JUMPDEST 			
      PUSH 0			
      DUP2 			
      PUSH 3			
      SIGNEXTEND 			
      SWAP1 			
      POP 			
      SWAP2 			
      SWAP1 			
      POP 			
      JUMP 			
    tag 35			
      JUMPDEST 			
      PUSH [tag] 60			
      DUP2 			
      PUSH [tag] 34			
      JUMP 			
    tag 60			
      JUMPDEST 			
      DUP3 			
      MSTORE 			
      POP 			
      POP 			
      JUMP 			
    tag 36			
      JUMPDEST 			
      PUSH 0			
      PUSH [tag] 62			
      DUP4 			
      DUP4 			
      PUSH [tag] 35			
      JUMP 			
    tag 62			
      JUMPDEST 			
      PUSH 20			
      DUP4 			
      ADD 			
      SWAP1 			
      POP 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 37			
      JUMPDEST 			
      PUSH 0			
      PUSH 20			
      DUP3 			
      ADD 			
      SWAP1 			
      POP 			
      SWAP2 			
      SWAP1 			
      POP 			
      JUMP 			
    tag 38			
      JUMPDEST 			
      PUSH [tag] 65			
      DUP2 			
      PUSH [tag] 31			
      JUMP 			
    tag 65			
      JUMPDEST 			
      PUSH [tag] 66			
      DUP2 			
      DUP5 			
      PUSH [tag] 32			
      JUMP 			
    tag 66			
      JUMPDEST 			
      SWAP3 			
      POP 			
      PUSH [tag] 67			
      DUP3 			
      PUSH [tag] 33			
      JUMP 			
    tag 67			
      JUMPDEST 			
      DUP1 			
      PUSH 0			
    tag 68			
      JUMPDEST 			
      DUP4 			
      DUP2 			
      LT 			
      ISZERO 			
      PUSH [tag] 70			
      JUMPI 			
      DUP2 			
      MLOAD 			
      PUSH [tag] 71			
      DUP8 			
      DUP3 			
      PUSH [tag] 36			
      JUMP 			
    tag 71			
      JUMPDEST 			
      SWAP7 			
      POP 			
      PUSH [tag] 72			
      DUP4 			
      PUSH [tag] 37			
      JUMP 			
    tag 72			
      JUMPDEST 			
      SWAP3 			
      POP 			
      POP 			
      PUSH 1			
      DUP2 			
      ADD 			
      SWAP1 			
      POP 			
      PUSH [tag] 68			
      JUMP 			
    tag 70			
      JUMPDEST 			
      POP 			
      POP 			
      POP 			
      POP 			
      POP 			
      POP 			
      JUMP 			
    tag 9			
      JUMPDEST 			
      PUSH 0			
      PUSH 100			
      DUP3 			
      ADD 			
      SWAP1 			
      POP 			
      PUSH [tag] 74			
      PUSH 0			
      DUP4 			
      ADD 			
      DUP5 			
      PUSH [tag] 38			
      JUMP 			
    tag 74			
      JUMPDEST 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 39			
      JUMPDEST 			
      PUSH 0			
      DUP2 			
      SWAP1 			
      POP 			
      SWAP2 			
      SWAP1 			
      POP 			
      JUMP 			
    tag 40			
      JUMPDEST 			
      PUSH 4E487B7100000000000000000000000000000000000000000000000000000000			
      PUSH 0			
      MSTORE 			
      PUSH 11			
      PUSH 4			
      MSTORE 			
      PUSH 24			
      PUSH 0			
      REVERT 			
    tag 18			
      JUMPDEST 			
      PUSH 0			
      PUSH [tag] 78			
      DUP3 			
      PUSH [tag] 39			
      JUMP 			
    tag 78			
      JUMPDEST 			
      SWAP2 			
      POP 			
      PUSH [tag] 79			
      DUP4 			
      PUSH [tag] 39			
      JUMP 			
    tag 79			
      JUMPDEST 			
      SWAP3 			
      POP 			
      DUP3 			
      DUP3 			
      ADD 			
      SWAP1 			
      POP 			
      DUP1 			
      DUP3 			
      GT 			
      ISZERO 			
      PUSH [tag] 80			
      JUMPI 			
      PUSH [tag] 81			
      PUSH [tag] 40			
      JUMP 			
    tag 81			
      JUMPDEST 			
    tag 80			
      JUMPDEST 			
      SWAP3 			
      SWAP2 			
      POP 			
      POP 			
      JUMP 			
    tag 21			
      JUMPDEST 			
      PUSH 4E487B7100000000000000000000000000000000000000000000000000000000			
      PUSH 0			
      MSTORE 			
      PUSH 32			
      PUSH 4			
      MSTORE 			
      PUSH 24			
      PUSH 0			
      REVERT 			
    .data

UpbeatDylan avatar Jul 16 '24 07:07 UpbeatDylan

.code PUSH 80 contract Model {\n // Model... PUSH 40 contract Model {\n // Model... MSTORE contract Model {\n // Model... CALLVALUE 中初始化合约拥有者\n for (uint32... DUP1 中初始化合约拥有者\n for (uint32... ISZERO 中初始化合约拥有者\n for (uint32... PUSH [tag] 1 中初始化合约拥有者\n for (uint32... JUMPI 中初始化合约拥有者\n for (uint32... PUSH 0 中初始化合约拥有者\n for (uint32... DUP1 中初始化合约拥有者\n for (uint32... REVERT 中初始化合约拥有者\n for (uint32... tag 1 中初始化合约拥有者\n for (uint32... JUMPDEST 中初始化合约拥有者\n for (uint32... POP 中初始化合约拥有者\n for (uint32... PUSH 0 (i);\n
tag 4 int32(i);\n }\n }\n... JUMPDEST int32(i);\n }\n }\n... PUSH 1E0 }\n DUP2 \n PUSH FFFFFFFF \n }\n AND \n }\n LT \n }\n ISZERO int32(i);\n }\n }\n... PUSH [tag] 5 int32(i);\n }\n }\n... JUMPI int32(i);\n }\n }\n... DUP1 f PUSH 0 egated DUP3 p PUSH FFFFFFFF egated upd AND egated upd PUSH 1E0 egated upd DUP2 egated upd LT egated upd PUSH [tag] 7 egated upd JUMPI egated upd PUSH [tag] 8 egated upd PUSH [tag] 9 egated upd JUMP egated upd tag 8 egated upd JUMPDEST egated upd tag 7 egated upd JUMPDEST egated upd PUSH 8 egated upd SWAP2 egated upd DUP3 egated upd DUP3 egated upd DIV egated upd ADD egated upd SWAP2 egated upd SWAP1 egated upd MOD egated upd PUSH 4 egated upd MUL egated upd PUSH 100 egated updates\n fu EXP egated updates\n fu DUP2 egated updates\n fu SLOAD egated updates\n fu DUP2 egated updates\n fu PUSH FFFFFFFF egated updates\n fu MUL egated updates\n fu NOT egated updates\n fu AND egated updates\n fu SWAP1 egated updates\n fu DUP4 egated updates\n fu PUSH 3 egated updates\n fu SIGNEXTEND egated updates\n fu PUSH FFFFFFFF egated updates\n fu AND egated updates\n fu MUL egated updates\n fu OR egated updates\n fu SWAP1 egated updates\n fu SSTORE egated updates\n fu POP egated updates\n fu DUP1
DUP1
PUSH 1
ADD
SWAP2
POP
POP
PUSH [tag] 4 int32(i);\n }\n }\n... JUMP int32(i);\n }\n }\n... tag 5 int32(i);\n }\n }\n... JUMPDEST int32(i);\n }\n }\n... POP int32(i);\n }\n }\n... PUSH [tag] 11 contract Model {\n // Model... JUMP contract Model {\n // Model... tag 9 solidity ^0.8.18;\n\ncontract ... JUMPDEST solidity ^0.8.18;\n\ncontract ... PUSH 4E487B7100000000000000000000000000000000000000000000000000000000 parameter updates received in... PUSH 0 d MSTORE // Model parameter updates r... PUSH 32 ruct PUSH 4 n MSTORE \n constructo PUSH 24 造函数中 PUSH 0 REVERT // 在构造函数中初 tag 11 contract Model {\n // Model... JUMPDEST contract Model {\n // Model... PUSH #[$] 0000000000000000000000000000000000000000000000000000000000000000 contract Model {\n // Model... DUP1 contract Model {\n // Model... PUSH [$] 0000000000000000000000000000000000000000000000000000000000000000 contract Model {\n // Model... PUSH 0 contract Model {\n // Model... CODECOPY contract Model {\n // Model... PUSH 0 contract Model {\n // Model... RETURN contract Model {\n // Model... .data 0: .code PUSH 80 contract Model {\n // Model... PUSH 40 contract Model {\n // Model... MSTORE contract Model {\n // Model... CALLVALUE contract Model {\n // Model... DUP1 contract Model {\n // Model... ISZERO contract Model {\n // Model... PUSH [tag] 1 contract Model {\n // Model... JUMPI contract Model {\n // Model... PUSH 0 contract Model {\n // Model... DUP1 contract Model {\n // Model... REVERT contract Model {\n // Model... tag 1 contract Model {\n // Model... JUMPDEST contract Model {\n // Model... POP contract Model {\n // Model... PUSH 4 contract Model {\n // Model... CALLDATASIZE contract Model {\n // Model... LT contract Model {\n // Model... PUSH [tag] 2 contract Model {\n // Model... JUMPI contract Model {\n // Model... PUSH 0 contract Model {\n // Model... CALLDATALOAD contract Model {\n // Model... PUSH E0 contract Model {\n // Model... SHR contract Model {\n // Model... DUP1 contract Model {\n // Model... PUSH 1B3562B6 contract Model {\n // Model... EQ contract Model {\n // Model... PUSH [tag] 3 contract Model {\n // Model... JUMPI contract Model {\n // Model... tag 2 contract Model {\n // Model... JUMPDEST contract Model {\n // Model... PUSH 0 contract Model {\n // Model... DUP1 contract Model {\n // Model... REVERT contract Model {\n // Model... tag 3 ] memory) {\n int32[8] ... JUMPDEST ] memory) {\n int32[8] ... PUSH [tag] 4 ] memory) {\n int32[8] ... PUSH 4 ] memory) {\n int32[8] ... DUP1 ] memory) {\n int32[8] ... CALLDATASIZE ] memory) {\n int32[8] ... SUB ] memory) {\n int32[8] ... DUP2 ] memory) {\n int32[8] ... ADD ] memory) {\n int32[8] ... SWAP1 ] memory) {\n int32[8] ... PUSH [tag] 5 ] memory) {\n int32[8] ... SWAP2 ] memory) {\n int32[8] ... SWAP1 ] memory) {\n int32[8] ... PUSH [tag] 6 ] memory) {\n int32[8] ... JUMP ] memory) {\n int32[8] ... tag 5 ] memory) {\n int32[8] ... JUMPDEST ] memory) {\n int32[8] ... PUSH [tag] 7 ] memory) {\n int32[8] ... JUMP ] memory) {\n int32[8] ... tag 4 ] memory) {\n int32[8] ... JUMPDEST ] memory) {\n int32[8] ... PUSH 40 ] memory) {\n int32[8] ... MLOAD ] memory) {\n int32[8] ... PUSH [tag] 8 ] memory) {\n int32[8] ... SWAP2 ] memory) {\n int32[8] ... SWAP1 ] memory) {\n int32[8] ... PUSH [tag] 9 ] memory) {\n int32[8] ... JUMP ] memory) {\n int32[8] ... tag 8 ] memory) {\n int32[8] ... JUMPDEST ] memory) {\n int32[8] ... PUSH 40 ] memory) {\n int32[8] ... MLOAD ] memory) {\n int32[8] ... DUP1 ] memory) {\n int32[8] ... SWAP2 ] memory) {\n int32[8] ... SUB ] memory) {\n int32[8] ... SWAP1 ] memory) {\n int32[8] ... RETURN ] memory) {\n int32[8] ... tag 7 ] memory) {\n int32[8] ... JUMPDEST ] memory) {\n int32[8] ... PUSH [tag] 10 (uint256 i = 0; PUSH [tag] 11 (uint256 i = 0; JUMP (uint256 i = 0; tag 10 (uint256 i = 0; JUMPDEST (uint256 i = 0; PUSH [tag] 13 {\n vs[ PUSH [tag] 11 {\n vs[ JUMP {\n vs[ tag 13 {\n vs[ JUMPDEST {\n vs[ PUSH 0 rt + i];\n tag 14 s[start + i];\n }\n ... JUMPDEST s[start + i];\n }\n ... PUSH 8 DUP2 LT }\n ISZERO s[start + i];\n }\n ... PUSH [tag] 15 s[start + i];\n }\n ... JUMPI s[start + i];\n }\n ... PUSH 0 DUP2 DUP6 PUSH FFFFFFFF AND PUSH [tag] 17 SWAP2 SWAP1 PUSH [tag] 18 JUMP tag 17 JUMPDEST PUSH 1E0 DUP2 LT PUSH [tag] 19 JUMPI PUSH [tag] 20 PUSH [tag] 21 JUMP tag 20 JUMPDEST tag 19 JUMPDEST PUSH 8 SWAP2 DUP3 DUP3 DIV ADD SWAP2 SWAP1 MOD PUSH 4 MUL SWAP1 SLOAD SWAP1 PUSH 100 EXP SWAP1 DIV PUSH 3 SIGNEXTEND DUP3 } DUP3 } PUSH 8 }\n}\n DUP2 }\n}\n LT }\n}\n PUSH [tag] 23 }\n}\n JUMPI }\n}\n PUSH [tag] 24 }\n}\n PUSH [tag] 21 }\n}\n JUMP }\n}\n tag 24 }\n}\n JUMPDEST }\n}\n tag 23 }\n}\n JUMPDEST }\n}\n PUSH 20 }\n}\n MUL }\n}\n ADD }\n}\n SWAP1 }\n}\n PUSH 3 }\n}\n SIGNEXTEND }\n}\n SWAP1 }\n}\n DUP2 }\n}\n PUSH 3 }\n}\n SIGNEXTEND }\n}\n DUP2 }\n}\n MSTORE }\n}\n POP }\n}\n POP }\n}\n DUP1
DUP1
PUSH 1
ADD
SWAP2
POP
POP
PUSH [tag] 14 s[start + i];\n }\n ... JUMP s[start + i];\n }\n ... tag 15 s[start + i];\n }\n ... JUMPDEST s[start + i];\n }\n ... POP s[start + i];\n }\n ... DUP1 SWAP2 POP POP SWAP2 ] memory) {\n int32[8] ... SWAP1 ] memory) {\n int32[8] ... POP ] memory) {\n int32[8] ... JUMP ] memory) {\n int32[8] ... tag 11 JUMPDEST PUSH 40 MLOAD DUP1 PUSH 100 ADD PUSH 40 MSTORE DUP1 PUSH 8 SWAP1 PUSH 20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP POP SWAP1 JUMP tag 26 round\n int32[480] weights;... JUMPDEST round\n int32[480] weights;... PUSH 0 f DUP1 REVERT 者\n fo tag 28 wnload(uint32 start) public vi... JUMPDEST wnload(uint32 start) public vi... PUSH 0 urns (i PUSH FFFFFFFF ] memory v DUP3 int32 AND int32[8] memory vs SWAP1 ory) {\n int32[8] memor... POP ory) {\n int32[8] memor... SWAP2 wnload(uint32 start) public vi... SWAP1 wnload(uint32 start) public vi... POP wnload(uint32 start) public vi... JUMP wnload(uint32 start) public vi... tag 29 or (uint256 i = 0; i < 8; i++)... JUMPDEST or (uint256 i = 0; i < 8; i++)... PUSH [tag] 47 \n }\n retu DUP2 ret PUSH [tag] 28 \n }\n retu JUMP \n }\n retu tag 47 \n }\n retu JUMPDEST \n }\n retu DUP2 t + i EQ tart + i];\n }\n ... PUSH [tag] 48 weights[start + i];\n ... JUMPI weights[start + i];\n ... PUSH 0 DUP1 \n REVERT ;\n }\n}\n tag 48 weights[start + i];\n ... JUMPDEST weights[start + i];\n ... POP or (uint256 i = 0; i < 8; i++)... JUMP or (uint256 i = 0; i < 8; i++)... tag 30 JUMPDEST PUSH 0 DUP2 CALLDATALOAD SWAP1 POP PUSH [tag] 50 DUP2 PUSH [tag] 29 JUMP tag 50 JUMPDEST SWAP3 SWAP2 POP POP JUMP tag 6 JUMPDEST PUSH 0 PUSH 20 DUP3 DUP5 SUB SLT ISZERO PUSH [tag] 52 JUMPI PUSH [tag] 53 PUSH [tag] 26 JUMP tag 53 JUMPDEST tag 52 JUMPDEST PUSH 0 PUSH [tag] 54 DUP5 DUP3 DUP6 ADD PUSH [tag] 30 JUMP tag 54 JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP tag 31 JUMPDEST PUSH 0 PUSH 8 SWAP1 POP SWAP2 SWAP1 POP JUMP tag 32 JUMPDEST PUSH 0 DUP2 SWAP1 POP SWAP3 SWAP2 POP POP JUMP tag 33 JUMPDEST PUSH 0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP tag 34 JUMPDEST PUSH 0 DUP2 PUSH 3 SIGNEXTEND SWAP1 POP SWAP2 SWAP1 POP JUMP tag 35 JUMPDEST PUSH [tag] 60 DUP2 PUSH [tag] 34 JUMP tag 60 JUMPDEST DUP3 MSTORE POP POP JUMP tag 36 JUMPDEST PUSH 0 PUSH [tag] 62 DUP4 DUP4 PUSH [tag] 35 JUMP tag 62 JUMPDEST PUSH 20 DUP4 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP tag 37 JUMPDEST PUSH 0 PUSH 20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP tag 38 JUMPDEST PUSH [tag] 65 DUP2 PUSH [tag] 31 JUMP tag 65 JUMPDEST PUSH [tag] 66 DUP2 DUP5 PUSH [tag] 32 JUMP tag 66 JUMPDEST SWAP3 POP PUSH [tag] 67 DUP3 PUSH [tag] 33 JUMP tag 67 JUMPDEST DUP1 PUSH 0 tag 68 JUMPDEST DUP4 DUP2 LT ISZERO PUSH [tag] 70 JUMPI DUP2 MLOAD PUSH [tag] 71 DUP8 DUP3 PUSH [tag] 36 JUMP tag 71 JUMPDEST SWAP7 POP PUSH [tag] 72 DUP4 PUSH [tag] 37 JUMP tag 72 JUMPDEST SWAP3 POP POP PUSH 1 DUP2 ADD SWAP1 POP PUSH [tag] 68 JUMP tag 70 JUMPDEST POP POP POP POP POP POP JUMP tag 9 JUMPDEST PUSH 0 PUSH 100 DUP3 ADD SWAP1 POP PUSH [tag] 74 PUSH 0 DUP4 ADD DUP5 PUSH [tag] 38 JUMP tag 74 JUMPDEST SWAP3 SWAP2 POP POP JUMP tag 39 JUMPDEST PUSH 0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP tag 40 JUMPDEST PUSH 4E487B7100000000000000000000000000000000000000000000000000000000 PUSH 0 MSTORE PUSH 11 PUSH 4 MSTORE PUSH 24 PUSH 0 REVERT tag 18 JUMPDEST PUSH 0 PUSH [tag] 78 DUP3 PUSH [tag] 39 JUMP tag 78 JUMPDEST SWAP2 POP PUSH [tag] 79 DUP4 PUSH [tag] 39 JUMP tag 79 JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH [tag] 80 JUMPI PUSH [tag] 81 PUSH [tag] 40 JUMP tag 81 JUMPDEST tag 80 JUMPDEST SWAP3 SWAP2 POP POP JUMP tag 21 JUMPDEST PUSH 4E487B7100000000000000000000000000000000000000000000000000000000 PUSH 0 MSTORE PUSH 32 PUSH 4 MSTORE PUSH 24 PUSH 0 REVERT .data

UpbeatDylan avatar Jul 16 '24 07:07 UpbeatDylan

Hey @ObscureLin!

Thanks for raising this. I would suggest that you consider submitting either a bug report that can help us reproduce the issue/error properly and investigate the bug or ask any broader questions like such in more support-centric forums such as the Ethereum StackExchange where the community can move the discussion forward. :)

To touch upon some of it briefly, the extra memory you mentioned is allocated for the return variable of the download() function. This memory goes unused in the end if the variable is unnamed and is not written to. If you're expecting that returning your own array would overwrite the one allocated by the compiler, that will actually not happen in Solidity. Memory variables are references, so your reference will simply be returned and the array allocated for the result will remain as is. Feel free to post the other specific questions in the community mentioned above and you should be able to get more help from there.

Additionally, this specific issue seems to have the same underlying issue as https://github.com/ethereum/solidity/issues/13475 (the compiler not being able to optimise this) and has grounds for being closed as a duplicate of it. Please not that the the linked issue is closed as well because there is a separate catch-all issue for optimisations in general.

mehtavishwa30 avatar Oct 02 '24 08:10 mehtavishwa30