123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- namespace App\Helpers;
- use App\Helpers\TronHelper;
- class TronRawSerializer
- {
- public static function serializeRawData(array $rawData): string
- {
- $bin = '';
- // timestamp (field number = 1, wire type = 0)
- $bin .= self::encodeKey(1, 0);
- $bin .= self::encodeVarint($rawData['timestamp']);
-
- // ref_block_bytes (2, wire type = 2)
- $bin .= self::encodeKey(2, 2);
- $refBlockBytes = hex2bin($rawData['ref_block_bytes']);
- $bin .= self::encodeLengthDelimited($refBlockBytes);
-
- // ref_block_hash (3, wire type = 2)
- $bin .= self::encodeKey(3, 2);
- $refBlockHash = hex2bin($rawData['ref_block_hash']);
- $bin .= self::encodeLengthDelimited($refBlockHash);
-
- // expiration (4, wire type = 0)
- $bin .= self::encodeKey(4, 0);
- $bin .= self::encodeVarint($rawData['expiration']);
-
- // contract (5, repeated embedded message)
- foreach ($rawData['contract'] as $contract) {
- $bin .= self::encodeKey(5, 2);
- $contractBin = self::serializeContract($contract);
- $bin .= self::encodeLengthDelimited($contractBin);
- }
- // fee_limit (18, wire type = 0) — optional
- if (isset($rawData['fee_limit'])) {
- $bin .= self::encodeKey(18, 0);
- $bin .= self::encodeVarint($rawData['fee_limit']);
- }
- return $bin;
- }
- protected static function serializeContract(array $contract): string
- {
- $bin = '';
- // type (1, wire type = 0)
- $bin .= self::encodeKey(1, 0);
- $bin .= self::encodeVarint($contract['type']);
- // parameter (2, embedded)
- $bin .= self::encodeKey(2, 2);
- $parameterBin = self::serializeParameter($contract['parameter']);
- $bin .= self::encodeLengthDelimited($parameterBin);
- return $bin;
- }
- protected static function serializeParameter(array $param): string
- {
- $bin = '';
- if (isset($param['type_url'])) {
- // type_url (1)
- $bin .= self::encodeKey(1, 2);
- $bin .= self::encodeLengthDelimited($param['type_url']);
- }
- if (isset($param['value'])) {
- // value (2)
- $bin .= self::encodeKey(2, 2);
- $valueBin = self::serializeTriggerSmartContract($param['value']);
- $bin .= self::encodeLengthDelimited($valueBin);
- }
- return $bin;
- }
- protected static function serializeTriggerSmartContract(array $value): string
- {
- $bin = '';
- // owner_address (1)
- $bin .= self::encodeKey(1, 2);
- $bin .= self::encodeLengthDelimited(hex2bin($value['owner_address']));
-
- // contract_address (2)
- $bin .= self::encodeKey(2, 2);
- $bin .= self::encodeLengthDelimited(hex2bin($value['contract_address']));
-
- // call_value (3) — not used in TRC20
- // data (4)
- if (isset($value['data'])) {
- $bin .= self::encodeKey(4, 2);
- $bin .= self::encodeLengthDelimited(hex2bin($value['data']));
- }
- return $bin;
- }
- protected static function encodeKey($fieldNumber, $wireType): string
- {
- return self::encodeVarint(($fieldNumber << 3) | $wireType);
- }
- protected static function encodeVarint($value): string
- {
- $value = is_numeric($value) ? (int)$value : 0;
- $bin = '';
- while (true) {
- if (($value & ~0x7F) === 0) {
- $bin .= chr($value);
- break;
- } else {
- $bin .= chr(($value & 0x7F) | 0x80);
- $value >>= 7;
- }
- }
- return $bin;
- }
- protected static function encodeLengthDelimited(string $data): string
- {
- return self::encodeVarint(strlen($data)) . $data;
- }
- }
|