Невозможно проверить подпись или создается впечатление, что она подписана другой учетной записью при попытке подписать тC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно проверить подпись или создается впечатление, что она подписана другой учетной записью при попытке подписать т

Сообщение Anonymous »

Я пытаюсь подписать транзакцию в сети Tron, используя C#. Я могу отправить первоначальный запрос, получить ответ и ответить на него, однако ответ предполагает, что транзакция была подписана другим адресом учетной записи.
Чтобы попытаться объяснить немного дальше , Я пытаюсь отозвать вознаграждение за голосование, я делаю это в тестовой сети Shasta, идея состоит в том, чтобы иметь универсальную функцию подписи данных, поэтому мне не нужно создавать новую функцию для каждого типа транзакции, поэтому эта функция просто функция подписи, данные для подписи входят, подпись выходит как струны. Работа с JSON и HTTP выполняется вне этого.
Вот мой код:

Код: Выделить всё

public TronSigner(string privateKeyHex)
{
privateKey = privateKeyHex;
byte[] privateKeyBytes = ByteArrary.HexToByteArray(privateKey);
privKey = new NBitcoin.Key(privateKeyBytes, -1, false);
}
public string Sign(string data)
{
byte[] dataBytes = ByteArrary.HexToByteArray(data);
byte[] hashedData = Keccak256(dataBytes);
NBitcoin.Crypto.ECDSASignature eCDSASignature = privKey.Sign(new uint256(hashedData));

byte[] signatureBytes = eCDSASignature.ToCompact();
signatureBytes = AddByteToByteArray(signatureBytes, 0x41, true);

string signatureString = ByteArrary.ToHex(signatureBytes);

Debug.WriteLine("Signature: "  + signatureString);

return signatureString;
}

byte[] AddByteToByteArray(byte[] byteArray, byte value = 0x41, bool addToEnd = false)
{
byte[] newArray = new byte[byteArray.Length + 1];
if (addToEnd)
{
Array.Copy(byteArray, 0, newArray, 0, byteArray.Length);
newArray[newArray.Length - 1] = value;
}
else
{
newArray[0] = value;
Array.Copy(byteArray, 0, newArray, 1, byteArray.Length);
}
return newArray;
}
Обратите внимание: подписывающая сторона инициализируется, а затем команда запускается из внешнего скрипта, запускаемого нажатием кнопки (для создания этого я использую VS2022)
Я сохранил код JSON и HTTP, так как тестирование подтвердило его работу благодаря ответам, но если это имеет какое-то значение, моя строка JSON создается просто путем создания строки и использования переменных, где это применимо, в данном случае подпись представляет собой такую ​​же строку, как показано в код выше.
Вот некоторые отправленные данные и ответы:
Данные отправлены на вывод баланса

Код: Выделить всё

{"owner_address":"TPwyWCDK3bH6LuMLXa5n1p5tU9xDnRYgsq", "visible": true}
Ответ:

Код: Выделить всё

{"visible":true,"txID":"3fcb0c072920451c14a49b64aa216f3fb79d2e22c0f19d2a8e17017c0eb621d6","raw_data":{"contract":[{"parameter":{"value":{"owner_address":"TPwyWCDK3bH6LuMLXa5n1p5tU9xDnRYgsq"},"type_url":"type.googleapis.com/protocol.WithdrawBalanceContract"},"type":"WithdrawBalanceContract"}],"ref_block_bytes":"a4c7","ref_block_hash":"124cdadd5d6c5021","expiration":1734437376000,"timestamp":1734437316598},"raw_data_hex":"0a02a4c72208124cdadd5d6c50214080a098a4bd325a53080d124f0a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e576974686472617742616c616e6365436f6e747261637412170a1541995613e5afaf3c4df3c53c141f59c57dceb5d0e170f6cf94a4bd32"}
Затем я подписываю идентификатор транзакции (txID из ответа) для создания подписи, а затем отправляю следующий ответ JSON в широковещательную транзакцию:

Код: Выделить всё

{"raw_data":{"contract":[{"parameter":{"value":{"owner_address":"TPwyWCDK3bH6LuMLXa5n1p5tU9xDnRYgsq"},"type_url":"type.googleapis.com/protocol.WithdrawBalanceContract"},"type":"WithdrawBalanceContract"}],"ref_block_bytes":"a4c7","ref_block_hash":"124cdadd5d6c5021","expiration":1734437376000,"timestamp":1734437316598},"raw_data_hex":"0a02a4c72208124cdadd5d6c50214080a098a4bd325a53080d124f0a34747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e576974686472617742616c616e6365436f6e747261637412170a1541995613e5afaf3c4df3c53c141f59c57dceb5d0e170f6cf94a4bd32","signature":["304402202e877a87decd3a70ec0cabbf0a243baaf844462aedc30d9f543ea7033d5e62ab02207b3f614c01b8d1312605232174f41bd799c79c4224d244e399791c"],"txID":"3fcb0c072920451c14a49b64aa216f3fb79d2e22c0f19d2a8e17017c0eb621d6","visible":true}
Ответ Трона:

Код: Выделить всё

{"code":"SIGERROR","txid":"3fcb0c072920451c14a49b64aa216f3fb79d2e22c0f19d2a8e17017c0eb621d6","message":"Validate signature error: java.lang.IllegalArgumentException: Invalid point compression"}
Другой ответ с похожим сообщением, только в отправленном запросе меняется только идентификатор транзакции и, в свою очередь, подпись:

Код: Выделить всё

{"code":"SIGERROR","txid":"bb037464b014fcac4d44ba13c13a55a0cbdf15c9d3be089b6f16303680700e81","message":"Validate signature error: 3044022074b28bfd50813c6f33ec7ba729b0bc70d8226a4decc1b3094519db85723402c30220487301cff96c2363820157eef3d61792ec4e9c05546af18606801c is signed by TFqFg48KSVoTNv23Tdwa7wQ9qM4WJqfVSs but it is not contained of permission."}

Как видите, моя подпись не принимается должным образом. Но я очень не уверен, где я ошибаюсь. Я знаю, что в этом пакете есть множество других библиотек для отправки, получения, подписания и т. д., но ни одна из них не предназначена для C #, и я не могу воспроизвести их процессы для подписи. В ссылках и документации API также неясно, какую часть полученного ответа я должен здесь подписывать.
Если у вас есть какие-либо решения для этой проблемы, дайте мне знать, пожалуйста. обратите внимание, что я использую различные библиотеки, чтобы решить эту проблему, поэтому в любые примеры кода может потребоваться включать полные имена, такие как «NBitcoin.Crypto.ECDSASignature», как показано в моем коде. Вот мой текущий список использования на данный момент, не все используются, но они есть:

Код: Выделить всё

using NBitcoin;
using NBitcoin.Secp256k1;
using Org.BouncyCastle.Crypto.Digests;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using TronDotNet.Node;
using TronDotNet.Objects;
using TronNet;
using TronNet.Crypto;
using TronNet.Protocol;
using static TronNet.Protocol.Transaction.Types;
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/792 ... ccount-whe
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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