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...
}
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 setFinished
para deshabilitar createCountries
.
Ahora, cuando llene la countries
matriz, llame createCountries
con los códigos de país concatenados. En Web3.js:
await countryStore.createCountries("AWAFAOAIALAXADAEAR") ....
jaspe
henk
countries
en lotes, no todos a la vez.