Atippa on Nostr: ขอลองมั่วๆหน่อย sync block ...
ขอลองมั่วๆหน่อย sync block ไม่ไหวครับ ขี้เกียจรอ ขอใช้พวก web explorer เเทน 5555
1.แฮชของบล๊อก 774698 คืออะไร?
ตอบ
000000000000000000047a2aa34dcd6d66479afca995c6c182334f7d396bb521
วิธี ดูผ่าน https://mempool.space/block/000000000000000000047a2aa34dcd6d66479afca995c6c182334f7d396bb521
-----------------------------------------
2.signature ของข้อความจาก address นี้ถูกต้องหรือไม่
address: 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa
message: 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa
signature:HCsBcgB+Wcm8kOGMH8IpNeg0H4gjCrlqwDf/GlSXphZGBYxm0QkKEPhh9DTJRp2IDNUhVr0FhP9qCqo2W0recNM=
ตอบ ไม่
วิธี ./bitcoin-cli verifymessage 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa "H3w3Ktw5AaGq1DUHQp9qZcQ3mUMeDZgPz5U2bWktjb5qYd0+ZyRAyx5hLgV2t4BKTogC4dDzGC7X/krR5g5owmU=" "1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa"
-----------------------------------------
3.มี output ใหม่กี่อันที่เกิดในบล๊อก 774698 ?
ตอบ output 9723 รายการ
วิธี ใช้ node รันเเล้วนับผลรวม โค๊ดตามด้านล่าง
const BLOCK_HEIGHT = 774698;
const BASE_URL = " https://mempool.space/api";;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function countOutputsInBlock(height) {
const blockHash = await (
await fetch(`${BASE_URL}/block-height/${height}`)
).text();
const txids = await (
await fetch(`${BASE_URL}/block/${blockHash}/txids`)
).json();
let totalOutputs = 0;
console.log("max iters", txids.length);
for (let i = 0; i < txids.length; i++) {
try {
const res = await fetch(`${BASE_URL}/tx/${txids[i]}`);
const result = await res.json();
totalOutputs += result.vout.length;
console.log(
`iter: ${i} Processed ${
(i / txids.length) * 100
} % , total output ${totalOutputs}`
);
await sleep(100);
} catch (err) {
console.error(`❌ Error fetching tx ${txids[i]}:`, err.message);
}
}
console.log(`📦 Block ${height} has ${totalOutputs} outputs`);
}
countOutputsInBlock(BLOCK_HEIGHT).catch(console.error);
-----------------------------------------
4.ใช้ wallet descriptors หา taproot address ที่ 100 จาก extended public key ที่กำหนดให้ xpub6DLd5RvY42Q5HAmBhHPUbDGdeS9VvsYNauiuN8r6NzbiXSSNWpNVrDGTUScJ9fS2orMtuB3VdxMdUH83fPtwbrizfJg9LwWnGqtL7RTs5h1
ตอบ bc1ptvzffg9usgjkgr36yf34v4kp7lzk4sfm60ne9wpw883q74c770gsmd2jzk
วิธี ใช้ node ช่วยแปลงตามโค๊ดด้านล่าง
const bitcoin = require('bitcoinjs-lib');
const { BIP32Factory } = require('bip32');
const ecc = require('tiny-secp256k1');
bitcoin.initEccLib(ecc);
const NETWORK = bitcoin.networks.bitcoin;
const xpub =
'xpub6DLd5RvY42Q5HAmBhHPUbDGdeS9VvsYNauiuN8r6NzbiXSSNWpNVrDGTUScJ9fS2orMtuB3VdxMdUH83fPtwbrizfJg9LwWnGqtL7RTs5h1';
const node = BIP32Factory(ecc).fromBase58(xpub, NETWORK);
const child = node.derive(0).derive(100);
const { address } = bitcoin.payments.p2tr({
internalPubkey: Buffer.from(child.publicKey.slice(1, 33)),
network: NETWORK,
});
console.log('Taproot address @ index 100:', address);
---------------------------------------
5.สร้าง multisig address แบบ P2SH แบบ 1-of-4 จาก publickey ในอินพุตทั้งสี่ของธุรกรรมนี้:37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517
ตอบ 3GyWg1CCD3RDpbwCbuk9TTRQptkRfczDz8
วิธี ใช้ node js ช่วย เเก้ ดึง key จาก ธุรกรรมดังกล่าวออกมา 4 อัน เเล้วนำมาสร้าง multisig address โค๊ดด้านล่าง
const bitcoin = require("bitcoinjs-lib");
fetch(
" https://blockstream.info/api/tx/37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517";
)
.then((response) => response.json())
.then((data) => {
const publickeys = data.vin.map((x) => x.witness[1]);
const pubkeys = publickeys.map((hex) => Buffer.from(hex, "hex"));
const p2ms = bitcoin.payments.p2ms({
m: 1,
pubkeys,
});
const p2sh = bitcoin.payments.p2sh({
redeem: p2ms,
});
console.log("🔐 P2SH (1-of-4) address:", p2sh.address);
console.log("🧱 Redeem Script:", p2sh.redeem.output.toString("hex"));
});
-----------------------------------------
5.สร้าง multisig address แบบ P2SH แบบ 1-of-4 จาก publickey ในอินพุตทั้งสี่ของธุรกรรมนี้:37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517
ตอบ 3GyWg1CCD3RDpbwCbuk9TTRQptkRfczDz8
วิธี ใช้ node js ช่วย เเก้ ดึง key จาก ธุรกรรมดังกล่าวออกมา 4 อัน เเล้วนำมาสร้าง multisig address โค๊ดด้านล่าง
const bitcoin = require("bitcoinjs-lib");
fetch(
" https://blockstream.info/api/tx/37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517";
)
.then((response) => response.json())
.then((data) => {
const publickeys = data.vin.map((x) => x.witness[1]);
const pubkeys = publickeys.map((hex) => Buffer.from(hex, "hex"));
const p2ms = bitcoin.payments.p2ms({
m: 1,
pubkeys,
});
const p2sh = bitcoin.payments.p2sh({
redeem: p2ms,
});
console.log("🔐 P2SH (1-of-4) address:", p2sh.address);
console.log("🧱 Redeem Script:", p2sh.redeem.output.toString("hex"));
});
--------------------------------------
6. tx ใดในบล็อก 257,343 ที่ใช้เอาท์พุตของ coinbase ของบล็อก 256,128?
ตอบ c54714cb1373c2e3725261fe201f267280e21350bdf2df505da8483a6a4805fc
วิธี ดูผ่าน mempool มันลิ้งไปมาระหว่างบล็อคให้เลย
link: https://mempool.space/tx/c54714cb1373c2e3725261fe201f267280e21350bdf2df505da8483a6a4805fc#vin=3
-----------------------------------------
7. มีเอาต์พุตเดียวที่ยังไม่ได้ใช้งานจากบล็อก 123,321 เอาต์พุตดังกล่าวถูกส่งไปที่ address ไหน
ตอบ 1FPDNNmgwEnKuF7GQzSqUcVQdzSRhz4pgX
วิธี ดูผ่าน mempool เเล้ว address ดังกล่าวหลังทำธุรกรรมไม่ได้มีการเคลื่อนไหวต่อ
link : https://mempool.space/tx/097e521fee933133729cfc34424c4277b36240b13ae4b01fda17756da1848c1e
-----------------------------------------
8. public key ใดที่ลงนามอินพุต 0 ใน tx นี้:e5969add849689854ac7f28e45628b89f7454b83e9699e551ce14b6f90c86163
ตอบ 025d524ac7ec6501d018d322334f142c7c11aa24b9cffec03161eca35a1e32a71f
วิธี เข้าไปดู ข้อมูลผ่าน mempool link: https://mempool.space/tx/e5969add849689854ac7f28e45628b89f7454b83e9699e551ce14b6f90c86163?mode=details
ดูรายละเอียด input/output ตรงส่วนของ witness เเละ witness script
ตรง witness จะมีค่า 01 ซึ่งเเปลงเป็นเป็น Boolean ได้ true พอเอาค่านี้ไปใช้ใน script จะเข้าเงื่อนไขของ if ซึ่งจะมี public key อยู่ในนั้น
----------------------------------------
1.แฮชของบล๊อก 774698 คืออะไร?
ตอบ
000000000000000000047a2aa34dcd6d66479afca995c6c182334f7d396bb521
วิธี ดูผ่าน https://mempool.space/block/000000000000000000047a2aa34dcd6d66479afca995c6c182334f7d396bb521
-----------------------------------------
2.signature ของข้อความจาก address นี้ถูกต้องหรือไม่
address: 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa
message: 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa
signature:HCsBcgB+Wcm8kOGMH8IpNeg0H4gjCrlqwDf/GlSXphZGBYxm0QkKEPhh9DTJRp2IDNUhVr0FhP9qCqo2W0recNM=
ตอบ ไม่
วิธี ./bitcoin-cli verifymessage 1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa "H3w3Ktw5AaGq1DUHQp9qZcQ3mUMeDZgPz5U2bWktjb5qYd0+ZyRAyx5hLgV2t4BKTogC4dDzGC7X/krR5g5owmU=" "1E9YwDtYf9R29ekNAfbV7MvB4LNv7v3fGa"
-----------------------------------------
3.มี output ใหม่กี่อันที่เกิดในบล๊อก 774698 ?
ตอบ output 9723 รายการ
วิธี ใช้ node รันเเล้วนับผลรวม โค๊ดตามด้านล่าง
const BLOCK_HEIGHT = 774698;
const BASE_URL = " https://mempool.space/api";;
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
async function countOutputsInBlock(height) {
const blockHash = await (
await fetch(`${BASE_URL}/block-height/${height}`)
).text();
const txids = await (
await fetch(`${BASE_URL}/block/${blockHash}/txids`)
).json();
let totalOutputs = 0;
console.log("max iters", txids.length);
for (let i = 0; i < txids.length; i++) {
try {
const res = await fetch(`${BASE_URL}/tx/${txids[i]}`);
const result = await res.json();
totalOutputs += result.vout.length;
console.log(
`iter: ${i} Processed ${
(i / txids.length) * 100
} % , total output ${totalOutputs}`
);
await sleep(100);
} catch (err) {
console.error(`❌ Error fetching tx ${txids[i]}:`, err.message);
}
}
console.log(`📦 Block ${height} has ${totalOutputs} outputs`);
}
countOutputsInBlock(BLOCK_HEIGHT).catch(console.error);
-----------------------------------------
4.ใช้ wallet descriptors หา taproot address ที่ 100 จาก extended public key ที่กำหนดให้ xpub6DLd5RvY42Q5HAmBhHPUbDGdeS9VvsYNauiuN8r6NzbiXSSNWpNVrDGTUScJ9fS2orMtuB3VdxMdUH83fPtwbrizfJg9LwWnGqtL7RTs5h1
ตอบ bc1ptvzffg9usgjkgr36yf34v4kp7lzk4sfm60ne9wpw883q74c770gsmd2jzk
วิธี ใช้ node ช่วยแปลงตามโค๊ดด้านล่าง
const bitcoin = require('bitcoinjs-lib');
const { BIP32Factory } = require('bip32');
const ecc = require('tiny-secp256k1');
bitcoin.initEccLib(ecc);
const NETWORK = bitcoin.networks.bitcoin;
const xpub =
'xpub6DLd5RvY42Q5HAmBhHPUbDGdeS9VvsYNauiuN8r6NzbiXSSNWpNVrDGTUScJ9fS2orMtuB3VdxMdUH83fPtwbrizfJg9LwWnGqtL7RTs5h1';
const node = BIP32Factory(ecc).fromBase58(xpub, NETWORK);
const child = node.derive(0).derive(100);
const { address } = bitcoin.payments.p2tr({
internalPubkey: Buffer.from(child.publicKey.slice(1, 33)),
network: NETWORK,
});
console.log('Taproot address @ index 100:', address);
---------------------------------------
5.สร้าง multisig address แบบ P2SH แบบ 1-of-4 จาก publickey ในอินพุตทั้งสี่ของธุรกรรมนี้:37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517
ตอบ 3GyWg1CCD3RDpbwCbuk9TTRQptkRfczDz8
วิธี ใช้ node js ช่วย เเก้ ดึง key จาก ธุรกรรมดังกล่าวออกมา 4 อัน เเล้วนำมาสร้าง multisig address โค๊ดด้านล่าง
const bitcoin = require("bitcoinjs-lib");
fetch(
" https://blockstream.info/api/tx/37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517";
)
.then((response) => response.json())
.then((data) => {
const publickeys = data.vin.map((x) => x.witness[1]);
const pubkeys = publickeys.map((hex) => Buffer.from(hex, "hex"));
const p2ms = bitcoin.payments.p2ms({
m: 1,
pubkeys,
});
const p2sh = bitcoin.payments.p2sh({
redeem: p2ms,
});
console.log("🔐 P2SH (1-of-4) address:", p2sh.address);
console.log("🧱 Redeem Script:", p2sh.redeem.output.toString("hex"));
});
-----------------------------------------
5.สร้าง multisig address แบบ P2SH แบบ 1-of-4 จาก publickey ในอินพุตทั้งสี่ของธุรกรรมนี้:37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517
ตอบ 3GyWg1CCD3RDpbwCbuk9TTRQptkRfczDz8
วิธี ใช้ node js ช่วย เเก้ ดึง key จาก ธุรกรรมดังกล่าวออกมา 4 อัน เเล้วนำมาสร้าง multisig address โค๊ดด้านล่าง
const bitcoin = require("bitcoinjs-lib");
fetch(
" https://blockstream.info/api/tx/37d966a263350fe747f1c606b159987545844a493dd38d84b070027a895c4517";
)
.then((response) => response.json())
.then((data) => {
const publickeys = data.vin.map((x) => x.witness[1]);
const pubkeys = publickeys.map((hex) => Buffer.from(hex, "hex"));
const p2ms = bitcoin.payments.p2ms({
m: 1,
pubkeys,
});
const p2sh = bitcoin.payments.p2sh({
redeem: p2ms,
});
console.log("🔐 P2SH (1-of-4) address:", p2sh.address);
console.log("🧱 Redeem Script:", p2sh.redeem.output.toString("hex"));
});
--------------------------------------
6. tx ใดในบล็อก 257,343 ที่ใช้เอาท์พุตของ coinbase ของบล็อก 256,128?
ตอบ c54714cb1373c2e3725261fe201f267280e21350bdf2df505da8483a6a4805fc
วิธี ดูผ่าน mempool มันลิ้งไปมาระหว่างบล็อคให้เลย
link: https://mempool.space/tx/c54714cb1373c2e3725261fe201f267280e21350bdf2df505da8483a6a4805fc#vin=3
-----------------------------------------
7. มีเอาต์พุตเดียวที่ยังไม่ได้ใช้งานจากบล็อก 123,321 เอาต์พุตดังกล่าวถูกส่งไปที่ address ไหน
ตอบ 1FPDNNmgwEnKuF7GQzSqUcVQdzSRhz4pgX
วิธี ดูผ่าน mempool เเล้ว address ดังกล่าวหลังทำธุรกรรมไม่ได้มีการเคลื่อนไหวต่อ
link : https://mempool.space/tx/097e521fee933133729cfc34424c4277b36240b13ae4b01fda17756da1848c1e
-----------------------------------------
8. public key ใดที่ลงนามอินพุต 0 ใน tx นี้:e5969add849689854ac7f28e45628b89f7454b83e9699e551ce14b6f90c86163
ตอบ 025d524ac7ec6501d018d322334f142c7c11aa24b9cffec03161eca35a1e32a71f
วิธี เข้าไปดู ข้อมูลผ่าน mempool link: https://mempool.space/tx/e5969add849689854ac7f28e45628b89f7454b83e9699e551ce14b6f90c86163?mode=details
ดูรายละเอียด input/output ตรงส่วนของ witness เเละ witness script
ตรง witness จะมีค่า 01 ซึ่งเเปลงเป็นเป็น Boolean ได้ true พอเอาค่านี้ไปใช้ใน script จะเข้าเงื่อนไขของ if ซึ่งจะมี public key อยู่ในนั้น
----------------------------------------