solidity
solidity copied to clipboard
Unknown EVM memory space while function returns a memory array.
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 :
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:
-
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.
-
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?
-
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
.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
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.