Cómo llenar una gran variedad de estructuras

Soy bastante nuevo en Solidity y quiero llenar una matriz con 240 estructuras.

tengo una estructura:

    struct Country {
      string name;
      uint level;
      uint attackPower;
      uint defensePower;
      uint price;
   }

Y una matriz:

    Country[] public countries;

Quiero llenar la matriz con países en implementación, pero cuando trato de hacerlo, se me acaba el combustible y el contrato ni siquiera se puede implementar (incluso cuando no se llama a la función). ¿Cuál es la forma correcta de lograr mi objetivo?

function createCountries() public{
    countries[0] = Country("AW",1, 100, 100, 1);
    countries[1] = Country("AF",1, 100, 100, 1);
    countries[2] = Country("AO",1, 100, 100, 1);
    countries[3] = Country("AI",1, 100, 100, 1);
    countries[4] = Country("AL",1, 100, 100, 1);
    countries[5] = Country("AX",1, 100, 100, 1);
    countries[6] = Country("AD",1, 100, 100, 1);
    countries[7] = Country("AE",1, 100, 100, 1);
    countries[8] = Country("AR",1, 100, 100, 1);
    countries[9] = Country("AM",1, 100, 100, 1);
    countries[10] = Country("AS",1, 100, 100, 1);
    countries[11] = Country("AQ",1, 100, 100, 1);
    countries[13] = Country("TF",1, 100, 100, 1);
    countries[14] = Country("AG",1, 100, 100, 1);
    countries[15] = Country("AU",1, 100, 100, 1);
    countries[16] = Country("AT",1, 100, 100, 1);
    countries[17] = Country("AZ",1, 100, 100, 1);
    countries[18] = Country("BI",1, 100, 100, 1);
    countries[19] = Country("BE",1, 100, 100, 1);
    countries[20] = Country("BJ",1, 100, 100, 1);
    countries[21] = Country("BF",1, 100, 100, 1);
    countries[22] = Country("BD",1, 100, 100, 1);
    countries[23] = Country("BG",1, 100, 100, 1);
    countries[24] = Country("BH",1, 100, 100, 1);
    countries[25] = Country("BS",1, 100, 100, 1);
    countries[26] = Country("BA",1, 100, 100, 1);
    countries[27] = Country("BL",1, 100, 100, 1);
    countries[28] = Country("BY",1, 100, 100, 1);
    countries[29] = Country("BZ",1, 100, 100, 1);
    countries[30] = Country("BM",1, 100, 100, 1);
    ... 210 more of these...
}

Respuestas (1)

Debe hacerlo por lotes y aprovechar el hecho de que todas las instancias de un país son casi iguales.

Creé este contrato como un ejemplo:

pragma solidity 0.4.23;

contract CountryStore {
    bool public finishedCreating = false;

    mapping(bytes2 => Country) public createCountries;

    struct Country {
      string name;
      uint level;
      uint attackPower;
      uint defensePower;
      uint price;
      bool created;
    }

    Country[] public countries;

    function createCountries(string names) public onlyWhileCreating {
       for(uint256 i = 0; i < bytes(names).length; i+=2){
           // Get the next two characters and store them in `name`
           bytes memory name = new bytes(2);
           name[0] = bytes(names)[i];
           name[1] = bytes(names)[i+1];

           if(!createCountries(bytes2(name)).created)
               countries.push(Country({
                   name: string(name),
                   level: 1,
                   attackPower: 100,
                   defensePower: 100,
                   price: 1,
                   created: true
               }));
       }
    }

    function finishCreating() public {
        finishedCreating = true;
    }

    modifier onlyWhileCreating(){
       require(!finishedCreating, "This method can only be called when creating countries");
       _;
    }
}

Realiza un seguimiento de cada país creado, por lo que evita duplicados. Además, cuando haya terminado, puede llamar setFinishedpara deshabilitar createCountries.

Ahora, cuando llene la countriesmatriz, llame createCountriescon los códigos de país concatenados. En Web3.js:

await countryStore.createCountries("AWAFAOAIALAXADAEAR") ....
¡Esta es una respuesta para esta situación! Pero me gustaría que mis otros atributos de Struct también fueran variables, esto ya no funcionaría, ¿verdad?
Eso es cierto, no funcionará para todas las situaciones. Aún así, la esencia de esto es que debe crear instancias countriesen lotes, no todos a la vez.