Solidumas, Dinaminės struktūros yra sudėtingi duomenų tipai kuriame galima saugoti kelis įvairaus dydžio elementus, pvz., masyvus, atvaizdus ar kitas struktūras. Sistema koduoja šias dinamines struktūras į dvejetainį formatą, naudodama Ethereum ABI (Application Binary Interface) kodavimo taisykles. Sistema užkoduoja struktūras, kai išsaugo arba perduoda jas operacijose.
Šių dvejetainių duomenų iššifravimas yra labai svarbus aiškinant išmaniosios sutarties būseną arba išvestį. Šis procesas apima supratimą, kaip Solidity tvarko ir pakuoja duomenis, ypač dinaminių tipų, kad tiksliai atkurtų pradinę struktūrą pagal jos dvejetainį vaizdą. Šis supratimas yra labai svarbus kuriant tvirtas ir sąveikias decentralizuotas programas.
Dinaminių struktūrų dekodavimas išorinėje kūrimo aplinkoje, kuri sąveikauja su blokų grandinės tinklu, yra sudėtinga. Šios struktūros gali apimti įvairaus dydžio masyvus, atvaizdus ir įdėtas struktūras. Jas reikia atidžiai tvarkyti, kad kodavimo ir dekodavimo metu duomenys būtų tikslūs. „Hyperledger Web3j“ tai išsprendėme kurdami objektų klases, kurios atitiktų numatomą „struct“ formatą „blockchain“ aplinkoje.
Šios objektų klasės yra sukurtos paveldėti iš org.web3j.abi.datatypes.DynamicStruct klasė, kuri yra dalis ABI modulis. Kūrėjai sukūrė šią klasę, kad galėtų susidoroti su dinaminių struktūrų ir kitų Solidity duomenų tipų kodavimo ir dekodavimo sudėtingumu. ABI modulis naudoja „Hyperledger Web3j“ tipo saugų atvaizdavimą, kad užtikrintų lengvą ir saugią sąveiką su šiomis sudėtingomis duomenų struktūromis..
Tačiau kai tikslas yra iš užkoduotų duomenų išgauti konkrečią vertę, specialiojo objekto sukūrimas gali tapti nereikalingu sudėtingumu. Šis metodas taip pat gali sunaudoti papildomų išteklių. Kad tai išspręstų, mūsų bendraautoriai „Camelacfadden“ ir „Antlion12“ padarė reikšmingų patobulinimų išplėtę org.web3j.abi.TypeReference klasė.
Jų patobulinimai leidžia dinamiškai dekoduoti tiesiogiai klasėje, todėl nebereikia kurti papildomų objektų. Šis pakeitimas supaprastina konkrečių verčių gavimo iš užkoduotų duomenų procesą. Ši pažanga sumažina pridėtines išlaidas ir supaprastina sąveiką su „blockchain“ duomenimis.
Dinaminės struktūros dekodavimas prieš tobulinimą
Kad būtų aiškiau, pateikiame kodo pavyzdį, kuriame parodyta, kaip prieš patobulinimus galite iššifruoti dinamines struktūras naudodami „Hyperledger Web3j“.
/**
* create the java object representing the solidity dinamyc struct
* struct User{
* uint256 user_id;
* string name;
* }
*/
public static class User extends DynamicStruct {
public BigInteger userId;
public String name;
public Boz(BigInteger userId, String name) {
super(
new org.web3j.abi.datatypes.generated.Uint256(data),
new org.web3j.abi.datatypes.Utf8String(name));
this.userId = userId;
this.name = name;
}
public Boz(Uint256 userId, Utf8String name) {
super(userId, name);
this.userId = userId.getValue();
this.name = name.getValue();
}
}
/**
* create the function which should be able to handle the class above
* as a solidity struct equivalent
*/
public static final org.web3j.abi.datatypes.Function getUserFunction = new org.web3j.abi.datatypes.Function(
FUNC_SETUSER,
Collections.emptyList(),
Arrays.>asList(new TypeReference() {}));
>
Dabar, kai atlikta būtina sąlyga, belieka tik iškviesti ir iššifruoti, o štai pavyzdys:
@Test
public void testDecodeDynamicStruct2() {
String rawInput =
"0x0000000000000000000000000000000000000000000000000000000000000020"
+ "000000000000000000000000000000000000000000000000000000000000000a"
+ "0000000000000000000000000000000000000000000000000000000000000040"
+ "0000000000000000000000000000000000000000000000000000000000000004"
+ "4a686f6e00000000000000000000000000000000000000000000000000000000
";
assertEquals(
FunctionReturnDecoder.decode(
rawInput,
getUserFunction.getOutputParameters()),
Collections.singletonList(new User(BigInteger.TEN, "John")));
}
Aukščiau pateiktame teste iššifravome ir patvirtinome, kad rawInput yra vartotojo struktūra, turinti pavadinimą John ir userId 10.
Dinaminės struktūros dekodavimas su nauju patobulinimu
Taikant naują požiūrį, deklaruoti lygiavertę struct objekto klasę nebereikia. Kai metodas gauna užkoduotus duomenis, jis gali iš karto juos iššifruoti sukurdamas atitinkamą nuorodos tipą. Tai supaprastina darbo eigą ir sumažina papildomų klasių apibrėžimų poreikį. Peržiūrėkite šį pavyzdį, kaip tai galima įgyvendinti:
public void testDecodeDynamicStruct2() {
String rawInput =
"0x0000000000000000000000000000000000000000000000000000000000000020"
+ "000000000000000000000000000000000000000000000000000000000000000a"
+ "0000000000000000000000000000000000000000000000000000000000000040"
+ "0000000000000000000000000000000000000000000000000000000000000004"
+ "4a686f6e00000000000000000000000000000000000000000000000000000000
";
TypeReference dynamicStruct =
new TypeReference(
false,
Arrays.asList(
TypeReference.makeTypeReference("uint256"),
TypeReference.makeTypeReference("string"))) {};
List decodedData =
FunctionReturnDecoder.decode(rawInput,
Utils.convert(Arrays.asList(dynamicStruct)));
List decodedDynamicStruct =
((DynamicStruct) decodedData.get(0)).getValue();
assertEquals(decodedDynamicStruct.get(0).getValue(), BigInteger.TEN);
assertEquals(decodedDynamicStruct.get(1).getValue(), "John");}
Apibendrinant, „Hyperledger Web3j“ padarė didelę pažangą supaprastindama dinaminių solidumo struktūrų dekodavimą. Tai apima vieną iš sudėtingiausių blokų grandinės kūrimo dalių. Įvesdami tokias objektų klases kaip org.web3j.abi.datatypes.DynamicStruct ir sustiprinti org.web3j.abi.TypeReference klasė, dabar sistema suteikia efektyvesnį ir supaprastintą šių sudėtingų duomenų tvarkymo metodą.
Kūrėjams nebereikia kurti specialių struktūrų klasių kiekvienai sąveikai, todėl sumažėja sudėtingumas ir išteklių suvartojimas. Šios pažangos ne tik padidina blokų grandinės programų efektyvumą, bet ir palengvina kūrimo procesą bei sumažina klaidų tikimybę. Tai galiausiai lemia patikimesnes ir sąveikesnes decentralizuotas sistemas.