Я пытаюсь подписать транзакцию, созданную с использованием https://api.trongrid.io/wallet/wallet/w ... ransaction . Мой текущий код выглядит так, где jsonnode txnode передается в signtransactionpayload - вывод RAW JSON этой конечной точки.
public static string SignTransactionPayload(JsonNode txNode, string stakingPrivateKey)
{
if (string.IsNullOrEmpty(stakingPrivateKey)) throw new ArgumentException("Private key cannot be null or empty", nameof(stakingPrivateKey));
byte[] txHash = GetTransactionHash(txNode);
if (txHash == null || txHash.Length != 32) throw new InvalidOperationException($"Invalid transaction hash length: {txHash?.Length ?? 0}");
string signature = SignTransactionHash(txHash, stakingPrivateKey);
// 65 bytes in hex = 130 characters (r + s + v)
if (signature.Length != 130) throw new InvalidOperationException($"Invalid signature length: {signature.Length} (expected 130)");
txNode["signature"] = new JsonArray { signature };
return txNode.ToJsonString();
}
private static byte[] GetTransactionHash(JsonNode txNode)
{
string rawDataHex = txNode["raw_data_hex"]?.ToString();
if (string.IsNullOrEmpty(rawDataHex)) throw new ArgumentException("raw_data_hex is missing or empty in the transaction");
byte[] rawDataBytes = Convert.FromHexString(rawDataHex);
if (rawDataBytes == null || rawDataBytes.Length == 0) throw new ArgumentException("Failed to decode raw_data_hex");
return Sha3.Sha3256().ComputeHash(rawDataBytes);
}
private static string SignTransactionHash(byte[] hash, string privateKeyHex)
{
var domain = SecNamedCurves.GetByName("secp256k1");
var privKey = new BigInteger(1, privateKeyHex.HexToByteArray());
var privParams = new ECPrivateKeyParameters(privKey, new ECDomainParameters(domain.Curve, domain.G, domain.N, domain.H));
var signer = new ECDsaSigner();
signer.Init(true, privParams);
var components = signer.GenerateSignature(hash);
var r = components[0].ToByteArrayUnsigned();
var s = components[1].ToByteArrayUnsigned();
// Ensure both r and s are 32 bytes with proper padding
var rBytes = new byte[32];
var sBytes = new byte[32];
Array.Copy(r, 0, rBytes, rBytes.Length - r.Length, r.Length);
Array.Copy(s, 0, sBytes, sBytes.Length - s.Length, s.Length);
// Combine r, s into a 65-byte signature (32 + 32 + 1 for v)
var signature = new byte[65];
Array.Copy(rBytes, 0, signature, 0, 32);
Array.Copy(sBytes, 0, signature, 32, 32);
signature[64] = 0; // recovery id (v), using 0 or 1
return Convert.ToHexString(signature).ToLowerInvariant();
}
< /code>
Это не работает. Он дает следующий ответ, когда подпись прикреплена к транзакции, и транслируется к API (message
был декодирован):
{
"code": "SIGERROR",
"txid": "e788ee8ddc14ca5c0db91eb650d7f11d7bf018e2df027f267e234a1f730b498f",
"message": "Validate signature error: 500def8ad521222c4aed8dfec2302d235ec30e02ef2ab5c7dce160ec702ef0d5ff7a3aec057c06bbac07471b7cddb823ed80a605258234e0c53c9ec094ec4ecb00 is signed by TZ9pyowoobbLH2PLLYboRXFq9dMo1MDiT2 but it is not contained of permission."
}
< /code>
Адрес, который он упоминает, tz9pyowoobblh2pllyborxfq9dmo1mdit2, не является владельцем транзакции. Более того, код создает другой адрес для каждого запуска. Однако я проверил, что мой личный ключ соответствует адресу владельца транзакции. В то время как мне нужно будет создать основные транзакции, которые, насколько мне известно, библиотеки, нет библиотеки, которая выполняет другую часть, которая мне нужна - делегирование энергии и пропускной способности от одного кошелька в другой. Мой обходной путь для этого - вручную публиковать полезную нагрузку в API. Но мне нужно подписать их, чтобы транслировать без подписных транзакций.
Я пытаюсь подписать транзакцию, созданную с использованием https://api.trongrid.io/wallet/wallet/wallet/wallet/wallet/createtransaction . Мой текущий код выглядит так, где jsonnode txnode передается в signtransactionpayload - вывод RAW JSON этой конечной точки. [code]public static string SignTransactionPayload(JsonNode txNode, string stakingPrivateKey) { if (string.IsNullOrEmpty(stakingPrivateKey)) throw new ArgumentException("Private key cannot be null or empty", nameof(stakingPrivateKey));
byte[] txHash = GetTransactionHash(txNode);
if (txHash == null || txHash.Length != 32) throw new InvalidOperationException($"Invalid transaction hash length: {txHash?.Length ?? 0}");
private static string SignTransactionHash(byte[] hash, string privateKeyHex) { var domain = SecNamedCurves.GetByName("secp256k1"); var privKey = new BigInteger(1, privateKeyHex.HexToByteArray()); var privParams = new ECPrivateKeyParameters(privKey, new ECDomainParameters(domain.Curve, domain.G, domain.N, domain.H));
var signer = new ECDsaSigner(); signer.Init(true, privParams); var components = signer.GenerateSignature(hash);
var r = components[0].ToByteArrayUnsigned(); var s = components[1].ToByteArrayUnsigned();
// Ensure both r and s are 32 bytes with proper padding var rBytes = new byte[32]; var sBytes = new byte[32];
// Combine r, s into a 65-byte signature (32 + 32 + 1 for v) var signature = new byte[65]; Array.Copy(rBytes, 0, signature, 0, 32); Array.Copy(sBytes, 0, signature, 32, 32); signature[64] = 0; // recovery id (v), using 0 or 1
return Convert.ToHexString(signature).ToLowerInvariant(); } < /code> Это не работает. Он дает следующий ответ, когда подпись прикреплена к транзакции, и транслируется к API (message[/code] был декодирован): { "code": "SIGERROR", "txid": "e788ee8ddc14ca5c0db91eb650d7f11d7bf018e2df027f267e234a1f730b498f", "message": "Validate signature error: 500def8ad521222c4aed8dfec2302d235ec30e02ef2ab5c7dce160ec702ef0d5ff7a3aec057c06bbac07471b7cddb823ed80a605258234e0c53c9ec094ec4ecb00 is signed by TZ9pyowoobbLH2PLLYboRXFq9dMo1MDiT2 but it is not contained of permission." } < /code> Адрес, который он упоминает, tz9pyowoobblh2pllyborxfq9dmo1mdit2, не является владельцем транзакции. Более того, код создает другой адрес для каждого запуска. Однако я проверил, что мой личный ключ соответствует адресу владельца транзакции. В то время как мне нужно будет создать основные транзакции, которые, насколько мне известно, библиотеки, нет библиотеки, которая выполняет другую часть, которая мне нужна - делегирование энергии и пропускной способности от одного кошелька в другой. Мой обходной путь для этого - вручную публиковать полезную нагрузку в API. Но мне нужно подписать их, чтобы транслировать без подписных транзакций.
Я пытаюсь подписать транзакцию, созданную с использованием . Мой текущий код выглядит так, где jsonnode txnode передается в signtransactionpayload - вывод RAW JSON этой конечной точки.
public static string SignTransactionPayload(JsonNode txNode,...
Я пытаюсь подписать транзакцию, созданную с использованием . Мой текущий код выглядит так, где jsonnode txnode передается в signtransactionpayload - вывод RAW JSON этой конечной точки.
public static string SignTransactionPayload(JsonNode txNode,...
У меня есть немного запутанного кода для проверки оператора индекса. Но некоторые компиляторы, как, например, MS VS-22 C ++ или GCC 8.3. Ошибка времени выполнения.
#include
У меня есть несколько запутанного кода, специально написанный для тестирования оператора индекса. E2. ). Но некоторые компиляторы, например, MS VS-22 C ++ (с поддержкой последнего стандарта C ++) или GCC 8.3. Ошибка времени выполнения.
#include...
Я пытаюсь создать приложение, которое на самом деле является кошельком Tron(TRX) . Как мне заставить его рассчитывать комиссию за каждую транзакцию до ее подтверждения от пользователя? Я понимаю тот факт, что tron использует некоторое количество...