tengo lo siguiente:
pragma solidity ^0.4.0;
contract MyContract {
struct FooFighter {
bool foo;
uint fighters;
}
mapping(bytes32 => FooFighter) public fooFighters;
Si quiero que el valor inicial de uint fighters sea un número predefinido en lugar de 0 para todos los fooFighters. ¿Como podría hacerlo?
No hay forma de tener un valor predeterminado para una variable de estado, especialmente para una asignación, ya que el EVM no tiene forma de saber antes de la asignación dónde se almacenará. La siguiente mejor opción para configurar valores de almacenamiento es el constructor.
Por lo tanto, no hay forma de asignar valores de estructura predeterminados en Solidity; sin embargo, al analizar los rastros compilados del siguiente contrato, encuentro que las variables de estructura declaradas con la memory
palabra clave tienen sus miembros inicializados explícitamente en valores cero antes de que se asignen los valores reales. Este no es el caso de las variables de estado de estructura que se asignan directamente.
contract abc
{
struct ABC {
uint a;
uint b;
uint c;
}
ABC s;
// Bytecode assigns value directly to storage slots
function s_pass() {
s = ABC({a:1, b:2, c:3});
}
// Bytcode initialised `ABC memory m` into `memory` with `0` values before assigning
function s_frm_m_pass() {
ABC memory m = ABC({a:1, b:2, c:3});
s = m;
}
}
Código de bytes de inicialización de estructura deABC memory m
JUMPDEST
PUSH1 60
PUSH1 40
MLOAD
SWAP1
DUP2
ADD
PUSH1 40
MSTORE // setup memory index for ABC.a
DUP1
PUSH1 00 // initialise ABC.a
DUP2
MSTORE // memory store ABC.a
PUSH1 20 // offset to ABC.b
ADD
PUSH1 00 // initialise ABC.b
DUP2
MSTORE // memory store ABC.b
PUSH1 20 // offset to ABC.c
ADD
PUSH1 00 // initialise ABC.c
DUP2
MSTORE // memory store ABC.c
POP
SWAP1
JUMP // return to function
El hecho de que el compilador haga esto para las estructuras memory
indica que podría haber un argumento para pasar los valores predeterminados mediante la asignación de una estructura de memoria inicializada pero no asignada. A continuación, podría pasar los valores predeterminados al almacenamiento de la siguiente manera...
// proposed default value syntax for structs
struct ABC {
uint a = 1;
uint b = 2;
uint c = 3;
}
// Assigning default struct values to storage
function s_frm_default() {
ABC memory m;
s = m;
}
Por supuesto, si está preparado para una cirugía de código de bytes posterior a la compilación, tal vez podría editar los PUSH1 00
valores que desee antes de implementar el contrato.
Sin embargo, todo esto es considerablemente más trabajo que simplementes = ABC({a:1, b:2, c:3});