witness commit

This commit is contained in:
Ben
2023-07-09 16:24:01 -04:00
parent 4b4b04a52c
commit b6ddca5a8f
6 changed files with 39 additions and 23 deletions
+7 -6
View File
@@ -37,7 +37,7 @@ export class MiningJob {
const coinbaseTransaction = this.createCoinbaseTransaction(payoutInformation, this.blockTemplate.coinbasevalue); const coinbaseTransaction = this.createCoinbaseTransaction(payoutInformation, this.blockTemplate.coinbasevalue);
this.block.transactions.unshift(coinbaseTransaction); this.block.transactions.unshift(coinbaseTransaction);
this.block.witnessCommit = bitcoinjs.Block.calculateMerkleRoot(this.block.transactions, true); // this.block.witnessCommit = bitcoinjs.Block.calculateMerkleRoot(this.block.transactions, true);
@@ -51,12 +51,12 @@ export class MiningJob {
// 1-byte - OP_RETURN (0x6a) // 1-byte - OP_RETURN (0x6a)
// 1-byte - Push the following 36 bytes (0x24) // 1-byte - Push the following 36 bytes (0x24)
// 4-byte - Commitment header (0xaa21a9ed) // 4-byte - Commitment header (0xaa21a9ed)
const segwitMagicBits = Buffer.from('aa21a9ed', 'hex'); //const segwitMagicBits = Buffer.from('aa21a9ed', 'hex');
// 32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value) // 32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value)
const commitmentHash = this.sha256(this.sha256(Buffer.concat([this.block.witnessCommit, coinbaseTransaction.ins[0].witness[0]]))); // const commitmentHash = this.sha256(this.sha256(Buffer.concat([this.block.witnessCommit, coinbaseTransaction.ins[0].witness[0]])));
// 39th byte onwards: Optional data with no consensus meaning // 39th byte onwards: Optional data with no consensus meaning
coinbaseTransaction.ins[0].script = Buffer.concat([Buffer.from([littleEndianBlockHeight.byteLength]), littleEndianBlockHeight, Buffer.from('00000000' + '00000000', 'hex')]); coinbaseTransaction.ins[0].script = Buffer.concat([Buffer.from([littleEndianBlockHeight.byteLength]), littleEndianBlockHeight, Buffer.from('00000000' + '00000000', 'hex')]);
coinbaseTransaction.addOutput(bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, commitmentHash])]), 0); //coinbaseTransaction.addOutput(bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, commitmentHash])]), 0);
// get the non-witness coinbase tx // get the non-witness coinbase tx
//@ts-ignore //@ts-ignore
@@ -103,13 +103,14 @@ export class MiningJob {
//recompute the roots //recompute the roots
testBlock.merkleRoot = this.calculateMerkleRootHash(testBlock.transactions[0].getHash(false), this.merkle_branch); testBlock.merkleRoot = this.calculateMerkleRootHash(testBlock.transactions[0].getHash(false), this.merkle_branch);
testBlock.witnessCommit = bitcoinjs.Block.calculateMerkleRoot(this.block.transactions, true); testBlock.witnessCommit = bitcoinjs.Block.calculateMerkleRoot(testBlock.transactions, true);
const segwitMagicBits = Buffer.from('aa21a9ed', 'hex'); const segwitMagicBits = Buffer.from('aa21a9ed', 'hex');
// 32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value) // 32-byte - Commitment hash: Double-SHA256(witness root hash|witness reserved value)
const commitmentHash = this.sha256(this.sha256(Buffer.concat([testBlock.witnessCommit, testBlock.transactions[0].ins[0].witness[0]]))); const commitmentHash = this.sha256(this.sha256(Buffer.concat([testBlock.witnessCommit, testBlock.transactions[0].ins[0].witness[0]])));
testBlock.transactions[0].outs[testBlock.transactions[0].outs.length - 1].script = bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, commitmentHash])]) // testBlock.transactions[0].outs[testBlock.transactions[0].outs.length - 1].script = bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, commitmentHash])])
testBlock.transactions[0].addOutput(bitcoinjs.script.compile([bitcoinjs.opcodes.OP_RETURN, Buffer.concat([segwitMagicBits, commitmentHash])]), 0)
testBlock.timestamp = timestamp; testBlock.timestamp = timestamp;
return testBlock; return testBlock;
+2 -2
View File
@@ -346,8 +346,8 @@ export class StratumV1Client extends EasyUnsubscribe {
if (submissionDifficulty >= job.networkDifficulty) { if (submissionDifficulty >= job.networkDifficulty) {
console.log('!!! BLOCK FOUND !!!'); console.log('!!! BLOCK FOUND !!!');
const blockHex = updatedJobBlock.toHex(false); const blockHex = updatedJobBlock.toHex(false);
this.bitcoinRpcService.SUBMIT_BLOCK(blockHex); const result = await this.bitcoinRpcService.SUBMIT_BLOCK(blockHex);
await this.notificationService.notifySubscribersBlockFound(this.clientAuthorization.address); await this.notificationService.notifySubscribersBlockFound(this.clientAuthorization.address, result);
} }
try { try {
await this.statistics.addSubmission(this.entity, submissionHash, this.sessionDifficulty); await this.statistics.addSubmission(this.entity, submissionHash, this.sessionDifficulty);
+7 -4
View File
@@ -57,17 +57,20 @@ export class BitcoinRpcService {
} }
public async SUBMIT_BLOCK(hexdata: string) { public async SUBMIT_BLOCK(hexdata: string): Promise<string> {
let response: string = '';
try { try {
const res = await this.client.submitblock({ response = await this.client.submitblock({
hexdata hexdata
}); });
console.log(`BLOCK SUBMISSION RESPONSE: ${res}`); console.log(`BLOCK SUBMISSION RESPONSE: ${response}`);
console.log(hexdata); console.log(hexdata);
console.log(JSON.stringify(res)); console.log(JSON.stringify(response));
} catch (e) { } catch (e) {
response = e;
console.log(`BLOCK SUBMISSION RESPONSE ERROR: ${e}`); console.log(`BLOCK SUBMISSION RESPONSE ERROR: ${e}`);
} }
return response;
} }
} }
+15 -2
View File
@@ -22,6 +22,7 @@ const commands = [
@Injectable() @Injectable()
export class DiscordService implements OnModuleInit { export class DiscordService implements OnModuleInit {
private token: string; private token: string;
private clientId: string; private clientId: string;
private guildId: string; private guildId: string;
@@ -37,6 +38,10 @@ export class DiscordService implements OnModuleInit {
this.guildId = this.configService.get('DISCORD_BOT_GUILD_ID'); this.guildId = this.configService.get('DISCORD_BOT_GUILD_ID');
this.channelId = this.configService.get('DISCORD_BOT_CHANNEL_ID') this.channelId = this.configService.get('DISCORD_BOT_CHANNEL_ID')
if (this.token.length < 1 || this.clientId.length < 1 || this.guildId.length < 1 || this.channelId.length < 1) {
return;
}
console.log('discord init') console.log('discord init')
this.commandCollection = new Collection(); this.commandCollection = new Collection();
@@ -49,6 +54,10 @@ export class DiscordService implements OnModuleInit {
async onModuleInit(): Promise<void> { async onModuleInit(): Promise<void> {
if (this.bot == null) {
return;
}
await this.registerCommands(); await this.registerCommands();
@@ -93,9 +102,13 @@ export class DiscordService implements OnModuleInit {
} }
} }
public async notifySUbscribersBlockFound() { public async notifySUbscribersBlockFound(message: string) {
if (this.bot == null) {
return;
}
const guild = await this.bot.guilds.fetch(this.guildId); const guild = await this.bot.guilds.fetch(this.guildId);
const channel = await guild.channels.fetch(this.channelId) as TextChannel; const channel = await guild.channels.fetch(this.channelId) as TextChannel;
channel.send("Block Found!") channel.send(`Block Found! result ${message}`)
} }
} }
+3 -3
View File
@@ -16,8 +16,8 @@ export class NotificationService implements OnModuleInit {
} }
public async notifySubscribersBlockFound(address: string) { public async notifySubscribersBlockFound(address: string, message: string) {
await this.discordService.notifySUbscribersBlockFound(); await this.discordService.notifySUbscribersBlockFound(message);
await this.telegramService.notifySubscribersBlockFound(address); await this.telegramService.notifySubscribersBlockFound(address, message);
} }
} }
+5 -6
View File
@@ -14,8 +14,7 @@ export class TelegramService implements OnModuleInit {
private readonly telegramSubscriptionsService: TelegramSubscriptionsService private readonly telegramSubscriptionsService: TelegramSubscriptionsService
) { ) {
const token: string | null = this.configService.get('TELEGRAM_BOT_TOKEN'); const token: string | null = this.configService.get('TELEGRAM_BOT_TOKEN');
if (token == null || token.length < 1) { if (token.length < 1) {
console.log('No Telegram token found');
return; return;
} }
this.bot = new TelegramBot(token, { polling: true }); this.bot = new TelegramBot(token, { polling: true });
@@ -27,7 +26,7 @@ export class TelegramService implements OnModuleInit {
async onModuleInit(): Promise<void> { async onModuleInit(): Promise<void> {
if (this.bot == null) { if (this.bot == null) {
return null; return;
} }
this.bot.onText(/\/subscribe/, async (msg) => { this.bot.onText(/\/subscribe/, async (msg) => {
@@ -49,14 +48,14 @@ export class TelegramService implements OnModuleInit {
}); });
} }
public async notifySubscribersBlockFound(address: string) { public async notifySubscribersBlockFound(address: string, message: string) {
if (this.bot == null) { if (this.bot == null) {
return null; return;
} }
const subscribers = await this.telegramSubscriptionsService.getSubscriptions(address); const subscribers = await this.telegramSubscriptionsService.getSubscriptions(address);
subscribers.forEach(subscriber => { subscribers.forEach(subscriber => {
this.bot.sendMessage(subscriber.telegramChatId, 'You found a block!'); this.bot.sendMessage(subscriber.telegramChatId, `You found a block! ${message}`);
}); });
} }
} }