6
6
7
7
#include < consensus/consensus.h>
8
8
#include < consensus/validation.h>
9
+ #include < issuance.h>
9
10
#include < key_io.h>
10
11
#include < script/script.h>
11
12
#include < script/standard.h>
16
17
#include < utilmoneystr.h>
17
18
#include < utilstrencodings.h>
18
19
20
+ #include < secp256k1_rangeproof.h>
21
+
22
+ static secp256k1_context* secp256k1_blind_context = NULL ;
23
+
24
+ class RPCRawTransaction_ECC_Init {
25
+ public:
26
+ RPCRawTransaction_ECC_Init () {
27
+ assert (secp256k1_blind_context == NULL );
28
+
29
+ secp256k1_context *ctx = secp256k1_context_create (SECP256K1_CONTEXT_NONE);
30
+ assert (ctx != NULL );
31
+
32
+ secp256k1_blind_context = ctx;
33
+ }
34
+
35
+ ~RPCRawTransaction_ECC_Init () {
36
+ secp256k1_context *ctx = secp256k1_blind_context;
37
+ secp256k1_blind_context = NULL ;
38
+
39
+ if (ctx) {
40
+ secp256k1_context_destroy (ctx);
41
+ }
42
+ }
43
+ };
44
+ static RPCRawTransaction_ECC_Init ecc_init_on_load;
45
+
19
46
UniValue ValueFromAmount (const CAmount& amount)
20
47
{
21
48
bool sign = amount < 0 ;
@@ -223,29 +250,65 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
223
250
o.pushKV (" asm" , ScriptToAsmStr (txin.scriptSig , true ));
224
251
o.pushKV (" hex" , HexStr (txin.scriptSig .begin (), txin.scriptSig .end ()));
225
252
in.pushKV (" scriptSig" , o);
253
+ in.pushKV (" is_pegin" , txin.m_is_pegin );
254
+ }
255
+ in.pushKV (" sequence" , (int64_t )txin.nSequence );
226
256
227
- if (tx.witness .vtxinwit .size () > i) {
228
- const CScriptWitness &scriptWitness = tx.witness .vtxinwit [i].scriptWitness ;
229
- if (!scriptWitness.IsNull ()) {
230
- UniValue txinwitness (UniValue::VARR);
231
- for (const auto &item : scriptWitness.stack ) {
232
- txinwitness.push_back (HexStr (item.begin (), item.end ()));
233
- }
234
- in.pushKV (" txinwitness" , txinwitness);
257
+ if (tx.witness .vtxinwit .size () > i) {
258
+ const CScriptWitness &scriptWitness = tx.witness .vtxinwit [i].scriptWitness ;
259
+ if (!scriptWitness.IsNull ()) {
260
+ UniValue txinwitness (UniValue::VARR);
261
+ for (const auto &item : scriptWitness.stack ) {
262
+ txinwitness.push_back (HexStr (item.begin (), item.end ()));
235
263
}
264
+ in.pushKV (" txinwitness" , txinwitness);
236
265
}
266
+ }
237
267
238
- // ELEMENTS:
239
- in.pushKV (" is_pegin" , txin.m_is_pegin );
240
- if (tx.witness .vtxinwit .size () > i && !tx.witness .vtxinwit [i].m_pegin_witness .IsNull ()) {
241
- UniValue pegin_witness (UniValue::VARR);
242
- for (const auto & item : tx.witness .vtxinwit [i].m_pegin_witness .stack ) {
243
- pegin_witness.push_back (HexStr (item.begin (), item.end ()));
244
- }
245
- in.pushKV (" pegin_witness" , pegin_witness);
268
+ // ELEMENTS:
269
+ if (tx.witness .vtxinwit .size () > i && !tx.witness .vtxinwit [i].m_pegin_witness .IsNull ()) {
270
+ UniValue pegin_witness (UniValue::VARR);
271
+ for (const auto & item : tx.witness .vtxinwit [i].m_pegin_witness .stack ) {
272
+ pegin_witness.push_back (HexStr (item.begin (), item.end ()));
246
273
}
274
+ in.pushKV (" pegin_witness" , pegin_witness);
247
275
}
248
- in.pushKV (" sequence" , (int64_t )txin.nSequence );
276
+ const CAssetIssuance& issuance = txin.assetIssuance ;
277
+ if (!issuance.IsNull ()) {
278
+ UniValue issue (UniValue::VOBJ);
279
+ issue.pushKV (" assetBlindingNonce" , issuance.assetBlindingNonce .GetHex ());
280
+ CAsset asset;
281
+ CAsset token;
282
+ uint256 entropy;
283
+ if (issuance.assetBlindingNonce .IsNull ()) {
284
+ GenerateAssetEntropy (entropy, txin.prevout , issuance.assetEntropy );
285
+ issue.pushKV (" assetEntropy" , entropy.GetHex ());
286
+ CalculateAsset (asset, entropy);
287
+ CalculateReissuanceToken (token, entropy, issuance.nAmount .IsCommitment ());
288
+ issue.pushKV (" isreissuance" , false );
289
+ issue.pushKV (" token" , token.GetHex ());
290
+ }
291
+ else {
292
+ issue.pushKV (" assetEntropy" , issuance.assetEntropy .GetHex ());
293
+ issue.pushKV (" isreissuance" , true );
294
+ CalculateAsset (asset, issuance.assetEntropy );
295
+ }
296
+ issue.pushKV (" asset" , asset.GetHex ());
297
+
298
+ if (issuance.nAmount .IsExplicit ()) {
299
+ issue.pushKV (" assetamount" , ValueFromAmount (issuance.nAmount .GetAmount ()));
300
+ } else if (issuance.nAmount .IsCommitment ()) {
301
+ issue.pushKV (" assetamountcommitment" , HexStr (issuance.nAmount .vchCommitment ));
302
+ }
303
+ if (issuance.nInflationKeys .IsExplicit ()) {
304
+ issue.pushKV (" tokenamount" , ValueFromAmount (issuance.nInflationKeys .GetAmount ()));
305
+ } else if (issuance.nInflationKeys .IsCommitment ()) {
306
+ issue.pushKV (" tokenamountcommitment" , HexStr (issuance.nInflationKeys .vchCommitment ));
307
+ }
308
+ in.pushKV (" issuance" , issue);
309
+ }
310
+ // END ELEMENTS
311
+
249
312
vin.push_back (in);
250
313
}
251
314
entry.pushKV (" vin" , vin);
@@ -256,7 +319,37 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
256
319
257
320
UniValue out (UniValue::VOBJ);
258
321
259
- out.pushKV (" value" , ValueFromAmount (txout.nValue ));
322
+ if (txout.nValue .IsExplicit ()) {
323
+ out.pushKV (" value" , ValueFromAmount (txout.nValue .GetAmount ()));
324
+ } else {
325
+ int exp;
326
+ int mantissa;
327
+ uint64_t minv;
328
+ uint64_t maxv;
329
+ const CTxOutWitness* ptxoutwit = tx.witness .vtxoutwit .size () <= i? NULL : &tx.witness .vtxoutwit [i];
330
+ if (ptxoutwit && secp256k1_rangeproof_info (secp256k1_blind_context, &exp, &mantissa, &minv, &maxv, &ptxoutwit->vchRangeproof [0 ], ptxoutwit->vchRangeproof .size ())) {
331
+ if (exp == -1 ) {
332
+ out.pushKV (" value" , ValueFromAmount ((CAmount)minv));
333
+ } else {
334
+ out.pushKV (" value-minimum" , ValueFromAmount ((CAmount)minv));
335
+ out.pushKV (" value-maximum" , ValueFromAmount ((CAmount)maxv));
336
+ }
337
+ out.pushKV (" ct-exponent" , exp);
338
+ out.pushKV (" ct-bits" , mantissa);
339
+ }
340
+ out.pushKV (" valuecommitment" , txout.nValue .GetHex ());
341
+ }
342
+ if (g_con_elementsmode) {
343
+ if (txout.nAsset .IsExplicit ()) {
344
+ out.pushKV (" asset" , txout.nAsset .GetAsset ().GetHex ());
345
+ } else {
346
+ out.pushKV (" assetcommitment" , txout.nAsset .GetHex ());
347
+ }
348
+
349
+ out.pushKV (" commitmentnonce" , txout.nNonce .GetHex ());
350
+ CPubKey pubkey (txout.nNonce .vchCommitment );
351
+ out.pushKV (" commitmentnonce_fully_valid" , pubkey.IsFullyValid ());
352
+ }
260
353
out.pushKV (" n" , (int64_t )i);
261
354
262
355
UniValue o (UniValue::VOBJ);
0 commit comments