C# Логика подписания для транзакции TRONC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 C# Логика подписания для транзакции TRON

Сообщение Anonymous »

Я пытаюсь подписать транзакцию, созданную с использованием 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://stackoverflow.com/questions/796 ... ransaction
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • C# Логика подписания для транзакции TRON
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • C# Логика подписания для транзакции TRON
    Anonymous » » в форуме C#
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Ошибка времени выполнения с использованием выражения подписания подписания
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Ошибка времени выполнения с использованием выражения подписания подписания, скомпилированной компилятором MS VS22 C ++
    Anonymous » » в форуме C++
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Оценка комиссии Tron перед подтверждением транзакции
    Anonymous » » в форуме Python
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»