Контракт ABI и префикс рекурсивной длины облегчены для JVM.
ABI Spec: https://solity.readthedocs.io/en/latest/abi-pec.html
RLP Spec: https://ethereum.org/en/developers/docs/data Структуры и поэкодировать/rlp
SHA-256 (Headlong-123.3.
Function baz = function.parse ("baz (uint32, bool)"); // канониказует и анализирует любую подпись // orfunction f2 = Function.fromjson ("{" type ":" function "," name ":" foo "," входы ": [{" name ":" specblem_nums "," type ":" tuple [] "," com Понценты ": [{" name ":" real "," type ":" fixed168x10 "}, {" name ":" воображаемый "," type ":" fixed168x10 "}]}]}"); Пара <long, Boolean> Bazargs = tuple.of (69l, true); Tuple ComplexNums = Single.of (New Tuple [] {tuple.of (new BigDecimal ("0,0090000000"), новый BigDecimal ("1,9500000000")}); // Два эквивалентных стиля: Bytebuffer Bazcall = baz.encodecall (bazargs); bytebuffer bazcall2 = baz.encodecallwithargs (69l, true); System.out.println ("Baz Call Hex: n" + Strings.encode (bazcall) + "n"); // шестнадцатеричное кодирование (без префикса 0x) // декодировать кодирование обратно в исходную argssystem.out.println ("Baz Args: n" + excretedArgs + "n"); // toString () system.out.println ("ровный: n" + excretedargs.equals (bazargs) + "n"); // тест на EqualitySystem.out.println ("Baz Call Debug: n" + baz.annotatecall (bazcall.array ()) + "n"); // Человеческие, читающие, для отладки вызовы функций (ожидают входного ввода с 4-байтового селектора) System.out.println ("Baz Args Debug: n" + baz.getinputs (). Анотат (Bazargs) + "n") ; // Человеческий, читаемый на человеке, для отладки кодировки без selectorsystem.out.println ("F2 Call Debug: n" + f2.annotatecall (ComplexNums) + "n"); System.out.println ("F2 Args Debug: n" " + f2.getInputs (). Аннотат (комплексы)); Function foo = function.parse ("foo ((fixed [], int8) [1] [] [5])", "(int, string)"); // Декодировать возвращаемый тип (int256, string) tuple decoded = foo.decodereturn (fasthex.decode ("000000000000000000000000000000000000000000000000000000000000002A"+ "0000000000000000000000000000000000000000000000000000000000000040"+ "0000000000000000000000000000000000000000000000000000000000000E"+ "59616F62616E6745696768747939000000000000000000000000000000000000")
); System.out.println (decoded.equals (tuple.of (biginteger.valueof (42l), "yaobangeighty9"))); Function footwo = function.parse ("footwo ()", "(uint8)"); int вернулся = footwo.decodesingletonretur (fasthex.decode ("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000fff"); // uint8 соответствует intsystem.out.println (возвращен); Tupletype <tuple> tt = tupletype.parse ("(bool, адрес, int72 [] [])"); bytebuffer b0 = tt.encode (tuple.of (false, addrap.wrap ("0x5290840009852786e0f7030069857d2e4169 BigInteger [0] [])); // tuple t = tt.decode (b0); // декодировать кортеж (имеет побочный эффект от продвижения позиции Bytebuffer) // или ... адрес a = tt.decode (b0, 1); // Декодировать только индекс 1System.out.println (a); Tuple T2 = tt.decode (b0, 0, 2); // Декодировать только индексы 0 и 2System.out.println (t2); bytebuffer b1 = tt. <abitype <biginteger [] [] >> get (2) .encode (new Biginteger [] [] {}); // кодировать только int72 [] [] Событие <?> Event = Event.fromjson ("{" type ":" Event "," name ":" an_event "," входы ": [{" name ":" a "," type ":" Bytes "," Indexted ": true} , {"name": "b", "type": "uint256", "Indexted": false}], "Anonymous": true} "); tuple args = Event.DecoDeargs (новый Byte [] [] {new Byte [32]}, New Byte [32]); System.out.println (event); System.out.println (args); // Создание любого типа напрямую (напрямую ( Advanced) Arraytype <abitype <object>,?, Object> at = Typefactory.create ("(адрес, int) []"); arraytype <tupletype <tuple>, tuple, tuple []> at2 = typefactory.create ("(адрес, int) []"); arraytype <tupletype <pare <Адрес, biginteger >>, пара <адрес, biginteger>, пара <адрес, biginteger> []> at3 = Typefactory.create ("(адрес, int) []"); abitype <object> неизвестно = typefactory.create (at.getCanonicalType ()); // Для примера класса студент, внедряющий какой -то пример Interfacepublic Student (byte [] rlp) {iterator <rlpitem> iter = rlpdecoder.rlp_strict.segenceiterator (rlp); this.name = iter.next (). Asstring (strings.utf_8); this.gpa = iter.next (). asfloat (false); this.publickey = iter.next (). новый BigDecimal (iter.next (). Asbigint (), iter.next (). asint ());
} @OverridePublic Object [] toobjectArray () {return New Object [] {// экземпляры байта [] strings.decode (name, strings.utf_8), plowatingpoint.tobytes (gpa), publickey, balance.unscaledvalue (). (), Integers.tobytes (balance.scale ()) // включают An Object [] или итерабильный, а его элементы будут закодироваться как список RLP (который может включать другие списки)};
} @OverridePublic byte [] torlp () {return rlpencoder.sequence (toobjectarray ());
}Теперь доступен в Maven Central Repository.
Или строить локально:
Клонировать проект и установить в местный репозиторий Maven, используя gradle publishToMavenLocal или mvn install , а затем объявьте его как зависимость:
Реализация ("com.esaulpaugh: Headlong: 12.3.4-Snapshot") <Зависимость>
<groupid> com.esaulpaugh </GroupId>
<Artifactid> Headlong </artifactid>
<версия> 12.3.4-snapshot </version>
</Зависимость>В качестве альтернативы:
Запустите gradle build или gradle jar , которая вывода для build/libs
Используйте mvn package , который выводит на target
Выполнить ant all build-jar , который выводит для build/lib
Добавить в качестве зависимости проекта в качестве зависимости проекта
Graalvm 20.0.2 на x86-64
https://github.com/esaulpaugh/headlong-cli
https://github.com/esaulpaugh/headlong-android
Также включает оптимизированные реализации:
EIP-778 Records Node Node
EIP-55 смешанная проверка контрольной суммы кодировки
Кеккак
шестнадцатеричный
Headlong зависит от GSON V2.10.1 для пакета ABI. Test Suite должен занять менее одной минуты. Тестовые пакеты требуют JUNIT. Размер банки составляет ~ 128 киб. Java 8+.
См. Вики для большего, например, упакованное кодирование (и декодирование) и обозначение объекта RLP: https://github.com/esaulpaugh/headlong/wiki
Лицензирован в условиях Apache 2.0