Tvirtai, Dinaminės struktūros yra sudėtingi duomenų tipai Tai gali laikyti kelis įvairaus dydžio elementus, tokius kaip masyvai, žemėlapiai ar kitos struktūros. Sistema koduoja šias dinamines struktūras į dvejetainį formatą, naudodama „Ethereum“ ABI (programos dvejetainę sąsają) kodavimo taisykles. Sistema koduoja struktūras, kai ji kaupia ar perduoda jas operacijose.
Šių dvejetainių duomenų iššifravimas yra labai svarbus aiškinant valstybės būseną ar išvedimą iš protingos sutarties. Šis procesas apima supratimą, kaip solidumas organizuoja ir supakuoja duomenis, ypač dinaminių tipų, kad būtų galima tiksliai rekonstruoti pradinę struktūrą iš dvejetainės reprezentacijos. Šis supratimas yra labai svarbus kuriant tvirtas ir sąveikus decentralizuotas programas.
Dekodinės dinaminės struktūros išorinėje plėtros aplinkoje, sąveikaujančioje su „blockchain“ tinklu. Šios struktūros gali apimti įvairių dydžių matricas, žemėlapius ir įdėtas struktūras. Jie reikalauja kruopštaus tvarkymo, kad duomenys būtų tikslūs kodavimo ir dekodavimo metu. „Hyperledger Web3J“ atkreipėme dėmesį į tai kurdami objektų klases, atitinkančias numatomą struktūros formatą „blockchain“ aplinkoje.
Šios objektų klasės yra skirtos paveldėti iš org.web3j.abi.datatypes.DynamicStruct klasė, kuri yra dalis Abi modulis. Kūrėjai suprojektavo šią klasę, kad galėtų tvarkyti kodavimo ir dekodavimo dinaminių struktūrų ir kitų tvirtumo duomenų tipų sudėtingumą.
„ABI“ modulis pasinaudoja „Hyperledger Web3J“ saugiu tipo žemėlapiais, kad užtikrintų lengvą ir saugią sąveiką su šiomis sudėtingomis duomenų struktūromis.
Tačiau kai tikslas yra išgauti konkrečią vertę iš užkoduotų duomenų, sukuriant specialų objektą, gali būti pridėta nereikalingo sudėtingumo. Šis požiūris taip pat gali panaudoti papildomus išteklius. Norėdami tai išspręsti, mūsų bendraautoriai Calmacfadden ir Anlion12 padarė reikšmingų patobulinimų, pratęsdami org.web3j.abi.TypeReference klasė.
Jų patobulinimai leidžia dinamiškai dekoduoti tiesiogiai klasėje, pašalinant poreikį kurti papildomus objektus. Šis pakeitimas supaprastina konkrečių verčių iš užkoduotų duomenų rinkimo procesą. Šis pažanga sumažina pridėtines išlaidas ir supaprastina sąveiką su „blockchain“ duomenimis.
Dekodinio dinaminės struktūros dekodavimas prieš patobulinimą
Norėdami paaiškinti, čia yra kodo pavyzdys, parodantis, 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 būtina sąlyga, liko vienintelis dalykas, kuris yra paskambinti, atlikite iššifravimą ir čia yra 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 bandyme mes iššifravome ir tvirtinome, kad „RawinPut“ yra vartotojo struktūra, turinti vardą John ir UserID 10.
Dekodinio dinaminės struktūros dekodavimas su nauju patobulinimu
Su nauju požiūriu, Nebūtina deklaruoti lygiavertės struktūros objekto klasės. Kai metodas gauna užkoduotus duomenis, jis gali jį nedelsdamas iššifruoti sukurdamas atitinkamą atskaitos tipą. Tai supaprastina darbo eigą ir sumažina papildomų klasių apibrėžimų poreikį.
Žr. Šį 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");}
Pabaigoje, „HyperLedger Web3J“ padarė didelę pažangą supaprastindama dinaminių tvirtumo struktūrų dekodavimą. Tai skirta viena iš sudėtingiausių „blockchain“ plėtros dalių. Pristatant objektų klases, pavyzdžiui, org.web3j.abi.datatypes.DynamicStruct ir tobulinti org.web3j.abi.TypeReference klasė, Dabar sistema pateikia efektyvesnį ir supaprastintą šių sudėtingų duomenų tipų tvarkymo metodą.
Kūrėjams nebereikia kurti specialių struktūrų klasių kiekvienai sąveikai, mažindami sudėtingumą ir išteklių vartojimą. Šie pasiekimai ne tik padidina „blockchain“ programų efektyvumą, bet ir palengvina kūrimo procesą ir mažiau linkęs į klaidas. Tai galiausiai lemia patikimesnes ir sąveikesnes decentralizuotas sistemas.