asignar un valor a un miembro en una estructura

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?

Respuestas (1)

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 memorypalabra 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 memoryindica 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 00valores 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});