Чтобы попытаться объяснить немного дальше , Я пытаюсь отозвать вознаграждение за голосование, я делаю это в тестовой сети 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;
}
Я сохранил код 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"}
Код: Выделить всё
{"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."}
Если у вас есть какие-либо решения для этой проблемы, дайте мне знать, пожалуйста. обратите внимание, что я использую различные библиотеки, чтобы решить эту проблему, поэтому в любые примеры кода может потребоваться включать полные имена, такие как «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