Skip to content

Commit ea99298

Browse files
committed
Merge remote-tracking branch 'upstream/master'
# Conflicts: # src/cryptonote_basic/cryptonote_basic.h
1 parent feff41d commit ea99298

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1634
-307
lines changed

.github/workflows/test.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
on: push
2+
3+
name: Test
4+
5+
jobs:
6+
build_lin:
7+
name: Ubuntu test
8+
runs-on: ubuntu-latest
9+
steps:
10+
- name: Prepare Ubuntu tools
11+
run: |
12+
sudo apt update
13+
sudo apt-get install -y libboost-dev libboost-system-dev libboost-date-time-dev libsodium-dev
14+
- name: Checkout code
15+
uses: actions/checkout@master
16+
- name: Test
17+
run: |
18+
npm install
19+
./tests/run.sh

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ Node-CryptoForkNote-Util with Merged Mining support
44
Installing locally and testing
55
-----
66
```
7-
npm install https://github.com/MoneroOcean/node-cryptoforknote-util
7+
JOBS=$(nproc) npm install https://github.com/MoneroOcean/node-cryptoforknote-util
8+
node_modules/cryptoforknote-util/tests/run.sh
89
```
910

1011
Dependencies

binding.gyp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
"target_name": "cryptoforknote",
55
"sources": [
66
"src/main.cc",
7-
"src/cryptonote_core/cryptonote_format_utils.cpp",
7+
"src/cryptonote_basic/cryptonote_format_utils.cpp",
88
"src/offshore/pricing_record.cpp",
99
"src/zephyr_oracle/pricing_record.cpp",
10+
"src/salvium_oracle/pricing_record.cpp",
1011
"src/crypto/tree-hash.c",
1112
"src/crypto/crypto.cpp",
1213
"src/crypto/crypto-ops.c",
@@ -31,7 +32,7 @@
3132
"-fno-exceptions -std=gnu11 -march=native -fPIC -DNDEBUG -Ofast -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2"
3233
],
3334
"cflags_cc": [
34-
"-fexceptions -frtti -std=c++14 -march=native -fPIC -DNDEBUG -Ofast -s -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2"
35+
"-fexceptions -frtti -std=c++17 -march=native -fPIC -DNDEBUG -Ofast -s -funroll-loops -fvariable-expansion-in-unroller -ftree-loop-if-convert-stores -fmerge-all-constants -fbranch-target-load-optimize2"
3536
],
3637
"xcode_settings": {
3738
"OTHER_CFLAGS": [ "-fexceptions -frtti" ]

index.js

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,28 @@ function hash256(buffer) {
4646
return sha256(sha256(buffer));
4747
};
4848

49-
function getMerkleRoot(transactions) {
49+
function sha256_3(buffer) {
50+
return crypto.createHash('sha3-256').update(buffer).digest();
51+
};
52+
53+
function hash256_3(buffer) {
54+
return sha256_3(sha256_3(buffer));
55+
};
56+
57+
function transaction_hash(transaction, forWitness) {
58+
if (forWitness && transaction.isCoinbase()) return Buffer.alloc(32, 0);
59+
return hash256(transaction.__toBuffer(undefined, undefined, forWitness));
60+
}
61+
62+
function transaction_hash3(transaction, forWitness) {
63+
if (forWitness && transaction.isCoinbase()) return Buffer.alloc(32, 0);
64+
return hash256_3(transaction.__toBuffer(undefined, undefined, forWitness));
65+
}
66+
67+
function getMerkleRoot(transactions, transaction_hash_func, detectWitness) {
5068
if (transactions.length === 0) return Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
51-
const forWitness = txesHaveWitnessCommit(transactions);
52-
const hashes = transactions.map(transaction => transaction.getHash(forWitness));
69+
const forWitness = detectWitness ? txesHaveWitnessCommit(transactions) : false;
70+
const hashes = transactions.map(transaction => transaction_hash_func(transaction, forWitness));
5371
const rootHash = fastMerkleRoot(hashes, hash256);
5472
return forWitness ? hash256(Buffer.concat([rootHash, transactions[0].ins[0].witness[0]])) : rootHash;
5573
}
@@ -157,7 +175,7 @@ module.exports.RavenBlockTemplate = function(rpcData, poolAddress) {
157175
};
158176
};
159177

160-
function update_merkle_root_hash(offset, payload, blob_in, blob_out) {
178+
function update_merkle_root_hash(offset, payload, blob_in, blob_out, transaction_hash_func, detectWitness) {
161179
const nTransactions = varuint.decode(blob_in, offset);
162180
offset += varuint.decode.bytes;
163181
let transactions = [];
@@ -166,21 +184,25 @@ function update_merkle_root_hash(offset, payload, blob_in, blob_out) {
166184
transactions.push(tx);
167185
offset += tx.byteLength();
168186
}
169-
getMerkleRoot(transactions).copy(blob_out, 4 + 32);
187+
getMerkleRoot(transactions, transaction_hash_func, detectWitness).copy(blob_out, 4 + 32);
170188
};
171189

172190
module.exports.blockHashBuff = function(blobBuffer) {
173191
return reverseBuffer(hash256(blobBuffer));
174192
};
175193

194+
module.exports.blockHashBuff3 = function(blobBuffer) {
195+
return reverseBuffer(hash256_3(blobBuffer));
196+
};
197+
176198
module.exports.convertRavenBlob = function(blobBuffer) {
177199
let header = blobBuffer.slice(0, 80);
178-
update_merkle_root_hash(80 + 8 + 32, false, blobBuffer, header);
200+
update_merkle_root_hash(80 + 8 + 32, false, blobBuffer, header, transaction_hash, true);
179201
return module.exports.blockHashBuff(header);
180202
};
181203

182204
module.exports.constructNewRavenBlob = function(blockTemplate, nonceBuff, mixhashBuff) {
183-
update_merkle_root_hash(80 + 8 + 32, false, blockTemplate, blockTemplate);
205+
update_merkle_root_hash(80 + 8 + 32, false, blockTemplate, blockTemplate, transaction_hash, true);
184206
nonceBuff.copy (blockTemplate, 80, 0, 8);
185207
mixhashBuff.copy(blockTemplate, 88, 0, 32);
186208
return blockTemplate;
@@ -217,12 +239,24 @@ module.exports.RtmBlockTemplate = function(rpcData, poolAddress) {
217239

218240
module.exports.convertRtmBlob = function(blobBuffer) {
219241
let header = blobBuffer.slice(0, 80);
220-
update_merkle_root_hash(80, true, blobBuffer, header);
242+
update_merkle_root_hash(80, true, blobBuffer, header, transaction_hash, true);
243+
return header;
244+
};
245+
246+
module.exports.convertKcnBlob = function(blobBuffer) {
247+
let header = blobBuffer.slice(0, 80);
248+
update_merkle_root_hash(80, false, blobBuffer, header, transaction_hash3, false);
221249
return header;
222250
};
223251

224252
module.exports.constructNewRtmBlob = function(blockTemplate, nonceBuff) {
225-
update_merkle_root_hash(80, true, blockTemplate, blockTemplate);
253+
update_merkle_root_hash(80, true, blockTemplate, blockTemplate, transaction_hash, true);
254+
nonceBuff.copy(blockTemplate, 76, 0, 4);
255+
return blockTemplate;
256+
};
257+
258+
module.exports.constructNewKcnBlob = function(blockTemplate, nonceBuff) {
259+
update_merkle_root_hash(80, false, blockTemplate, blockTemplate, transaction_hash3, false);
226260
nonceBuff.copy(blockTemplate, 76, 0, 4);
227261
return blockTemplate;
228262
};

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "cryptoforknote-util",
3-
"version": "15.0.1",
4-
"main": "cryptoforknote-util",
3+
"version": "15.6.2",
54
"author": {
65
"name": "LucasJones",
76
"email": "lucasjonesdev@hotmail.co.uk"
@@ -11,15 +10,16 @@
1110
"url": "https://github.com/haven-protocol-org/node-cryptoforknote-util.git"
1211
},
1312
"dependencies": {
14-
"promise": "*",
15-
"bindings": "*",
16-
"nan": "^2.14.2",
17-
"bignum": "^0.13.1",
18-
"sha3": "*",
1913
"base58-native": "*",
20-
"varuint-bitcoin": "^1.0.4",
14+
"bech32": "*",
15+
"bignum": "^0.13.1",
16+
"bindings": "*",
17+
"bitcoinjs-lib": "git+https://github.com/MoneroOcean/bitcoinjs-lib.git",
2118
"merkle-lib": "^2.0.10",
22-
"bitcoinjs-lib": "git+https://github.com/MoneroOcean/bitcoinjs-lib.git"
19+
"nan": "^2.20.0",
20+
"promise": "*",
21+
"sha3": "*",
22+
"varuint-bitcoin": "^1.0.4"
2323
},
2424
"keywords": [
2525
"cryptonight",

rtm.js

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const bignum = require('bignum');
22
const base58 = require('base58-native');
3+
const bech32 = require('bech32');
34
const bitcoin = require('bitcoinjs-lib');
45

56
const diff1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
@@ -148,14 +149,20 @@ function getTransactionBuffers(txs) {
148149
}
149150

150151
function addressToScript(addr) {
151-
const decoded = base58.decode(addr);
152-
if (decoded.length != 25) throw new Error('Invalid address length for ' + addr);
153-
if (!decoded) throw new Error('Base58 decode failed for ' + addr);
152+
let decoded;
153+
try {
154+
decoded = base58.decode(addr);
155+
} catch(err) {}
156+
if (!decoded || decoded.length != 25) {
157+
const decoded2 = Buffer.from(bech32.bech32.fromWords(bech32.bech32.decode(addr).words.slice(1)));
158+
if (decoded2.length != 20) throw new Error('Invalid address ' + addr);
159+
return Buffer.concat([Buffer.from([0x0, 0x14]), decoded2]);
160+
}
154161
const pubkey = decoded.slice(1, -4);
155162
return Buffer.concat([Buffer.from([0x76, 0xa9, 0x14]), pubkey, Buffer.from([0x88, 0xac])]);
156163
}
157164

158-
function createOutputTransaction(amount, payee, rewardToPool, reward, txOutputBuffers, payeeScript) {
165+
function createTransactionOutput(amount, payee, rewardToPool, reward, txOutputBuffers, payeeScript) {
159166
const payeeReward = amount;
160167
if (!payeeScript) payeeScript = addressToScript(payee);
161168
txOutputBuffers.push(Buffer.concat([
@@ -166,19 +173,25 @@ function createOutputTransaction(amount, payee, rewardToPool, reward, txOutputBu
166173
return { reward: reward - amount, rewardToPool: rewardToPool - amount };
167174
}
168175

169-
function generateOutputTransactions(rpcData, poolAddress) {
170-
let reward = rpcData.coinbasevalue;
176+
function generateTransactionOutputs(rpcData, poolAddress) {
177+
let reward = rpcData.coinbasevalue + (rpcData.coinbasedevreward ? rpcData.coinbasedevreward.value : 0);
171178
let rewardToPool = reward;
172179
let txOutputBuffers = [];
173180

181+
if (rpcData.coinbasedevreward) {
182+
const rewards = createTransactionOutput(rpcData.coinbasedevreward.value, null, rewardToPool, reward, txOutputBuffers, Buffer.from(rpcData.coinbasedevreward.scriptpubkey, 'hex'));
183+
reward = rewards.reward;
184+
rewardToPool = rewards.rewardToPool;
185+
}
186+
174187
if (rpcData.smartnode) {
175188
if (rpcData.smartnode.payee) {
176-
const rewards = createOutputTransaction(rpcData.smartnode.amount, rpcData.smartnode.payee, rewardToPool, reward, txOutputBuffers);
189+
const rewards = createTransactionOutput(rpcData.smartnode.amount, rpcData.smartnode.payee, rewardToPool, reward, txOutputBuffers);
177190
reward = rewards.reward;
178191
rewardToPool = rewards.rewardToPool;
179192
} else if (Array.isArray(rpcData.smartnode)) {
180193
for (let i in rpcData.smartnode) {
181-
const rewards = createOutputTransaction(rpcData.smartnode[i].amount, rpcData.smartnode[i].payee, rewardToPool, reward, txOutputBuffers);
194+
const rewards = createTransactionOutput(rpcData.smartnode[i].amount, rpcData.smartnode[i].payee, rewardToPool, reward, txOutputBuffers);
182195
reward = rewards.reward;
183196
rewardToPool = rewards.rewardToPool;
184197
}
@@ -187,49 +200,52 @@ function generateOutputTransactions(rpcData, poolAddress) {
187200

188201
if (rpcData.superblock) {
189202
for (let i in rpcData.superblock) {
190-
const rewards = createOutputTransaction(rpcData.superblock[i].amount, rpcData.superblock[i].payee, rewardToPool, reward, txOutputBuffers);
203+
const rewards = createTransactionOutput(rpcData.superblock[i].amount, rpcData.superblock[i].payee, rewardToPool, reward, txOutputBuffers);
191204
reward = rewards.reward;
192205
rewardToPool = rewards.rewardToPool;
193206
}
194207
}
195208

196209
if (rpcData.founder_payments_started && rpcData.founder) {
197210
const founderReward = rpcData.founder.amount || 0;
198-
const rewards = createOutputTransaction(founderReward, rpcData.founder.payee, rewardToPool, reward, txOutputBuffers);
211+
const rewards = createTransactionOutput(founderReward, rpcData.founder.payee, rewardToPool, reward, txOutputBuffers);
199212
reward = rewards.reward;
200213
rewardToPool = rewards.rewardToPool;
201214
}
202215

203-
createOutputTransaction(rewardToPool, null, rewardToPool, reward, txOutputBuffers, Buffer.from(addressToScript(poolAddress), "hex"));
216+
createTransactionOutput(rewardToPool, null, rewardToPool, reward, txOutputBuffers, Buffer.from(addressToScript(poolAddress), "hex"));
204217

205-
if (rpcData.default_witness_commitment !== undefined) {
206-
const witness_commitment = Buffer.from(rpcData.default_witness_commitment, 'hex');
207-
txOutputBuffers.unshift(Buffer.concat([
208-
packInt64LE(0),
209-
varIntBuffer(witness_commitment.length),
210-
witness_commitment
218+
if (rpcData.default_witness_commitment) {
219+
createTransactionOutput(0, null, rewardToPool, reward, txOutputBuffers, Buffer.from(rpcData.default_witness_commitment, 'hex'));
220+
txOutputBuffers.push(Buffer.concat([
221+
varIntBuffer(1),
222+
varIntBuffer(32),
223+
Buffer.alloc(32, 0)
211224
]));
212225
}
213226

214-
return Buffer.concat([ varIntBuffer(txOutputBuffers.length), Buffer.concat(txOutputBuffers)]);
227+
return Buffer.concat([ varIntBuffer(rpcData.default_witness_commitment ? txOutputBuffers.length - 1 : txOutputBuffers.length), Buffer.concat(txOutputBuffers)]);
215228
}
216229

217230
module.exports.RtmBlockTemplate = function(rpcData, poolAddress) {
218231
const extraNoncePlaceholderLength = 17;
219-
const coinbaseVersion = Buffer.concat([packUInt16LE(3), packUInt16LE(5)]);
232+
const coinbaseVersion = rpcData.coinbasedevreward ? Buffer.concat([packUInt16LE(1), packUInt16LE(0)]) : Buffer.concat([packUInt16LE(3), packUInt16LE(5)]);
220233

221234
const scriptSigPart1 = Buffer.concat([
222235
serializeNumber(rpcData.height),
223-
Buffer.from(rpcData.coinbaseaux.flags, 'hex'),
236+
Buffer.from(rpcData.coinbaseaux.flags ? rpcData.coinbaseaux.flags : "", 'hex'),
224237
serializeNumber(Date.now() / 1000 | 0),
225238
Buffer.from([extraNoncePlaceholderLength])
226239
]);
227240

228241
const scriptSigPart2 = serializeString('/nodeStratum/');
229242

243+
const is_witness = rpcData.default_witness_commitment !== undefined;
244+
230245
const blob1 = Buffer.concat([
231246
coinbaseVersion,
232247
// transaction input
248+
Buffer.from(is_witness ? "0001" : "", 'hex'),
233249
varIntBuffer(1), // txInputsCount
234250
uint256BufferFromHash(""), // txInPrevOutHash
235251
packUInt32LE(Math.pow(2, 32) - 1), // txInPrevOutIndex
@@ -242,13 +258,19 @@ module.exports.RtmBlockTemplate = function(rpcData, poolAddress) {
242258
packUInt32LE(0), // txInSequence
243259
// end transaction input
244260
// transaction output
245-
generateOutputTransactions(rpcData, poolAddress),
261+
generateTransactionOutputs(rpcData, poolAddress, is_witness),
246262
// end transaction ouput
247-
packUInt32LE(0), // txLockTime
248-
varIntBuffer(rpcData.coinbase_payload.length / 2),
249-
Buffer.from(rpcData.coinbase_payload, 'hex')
263+
packUInt32LE(0) // txLockTime
250264
]);
251265

266+
if (rpcData.coinbase_payload) {
267+
blob2 = Buffer.concat([
268+
blob2,
269+
varIntBuffer(rpcData.coinbase_payload.length / 2),
270+
Buffer.from(rpcData.coinbase_payload, 'hex')
271+
]);
272+
}
273+
252274
const prev_hash = reverseBuffer(Buffer.from(rpcData.previousblockhash, 'hex')).toString('hex');
253275
const version = packInt32LE(rpcData.version).toString('hex');
254276
const curtime = packUInt32LE(rpcData.curtime).toString('hex');

src/contrib/epee/include/serialization/keyvalue_serialization_overloads.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#pragma once
2828

29+
#include <cstdint>
2930
#include <set>
3031
#include <list>
3132
#include <vector>

src/cryptonote_core/account.h renamed to src/cryptonote_basic/account.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#pragma once
66

7-
#include "cryptonote_core/cryptonote_basic.h"
7+
#include "cryptonote_basic.h"
88
#include "crypto/crypto.h"
99
#include "serialization/keyvalue_serialization.h"
1010

0 commit comments

Comments
 (0)