| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | <?phpuse kornrunner\Secp256k1;use kornrunner\Serializer\HexSignatureSerializer;use kornrunner\Signature\Signature;use kornrunner\Util\Buffer;function signTransaction(array $transaction, string $privateKey): array {    $rawData = $transaction['raw_data'];    // 1. 将 raw_data 转为 JSON 字符串    $rawDataJson = json_encode($rawData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);    if ($rawDataJson === false) {        throw new \Exception("Invalid raw_data: " . json_last_error_msg());    }    // 2. 计算 SHA256 哈希(二进制形式)    $msgHash = hash('sha256', $rawDataJson, true); // raw binary    // 3. 构造私钥 buffer(二进制)    $privateKeyBin = hex2bin($privateKey);    if ($privateKeyBin === false || strlen($privateKeyBin) !== 32) {        throw new \Exception("Invalid private key format");    }    // 4. 签名    $secp256k1 = new Secp256k1();    $signature = $secp256k1->sign($msgHash, $privateKeyBin);    // 5. 生成 HEX 签名(包含 recovery ID)    $serializer = new HexSignatureSerializer();    $fullHex = $serializer->serialize($signature); // 130 hex chars: r + s + v (65 bytes)    // ⚠️ Tron 要求 r + s(不带 v) => 64 字节,即 128 字符的 hex 字符串    $r = substr($fullHex, 0, 64);    $s = substr($fullHex, 64, 64);    $sigHex = $r . $s;    return [        'txID' => $transaction['txID'],        'raw_data' => $transaction['raw_data'],        'signature' => [$sigHex],    ];}
 |