2025.01.09
nonce가 자동으로 증가하도록 코드를 수정하다 보니 이제까지 의 예제 string이 뭔가 잘못되어 있다.
모든 정보가 string으로 된다고 했는데 다시 정리해서 보니 말이 안된다.
일단 다시 정리
해더는 4+32+32+4+4+4 => 80byte (640bit)
Hash가 00000000000000000024fb37364cbf81fd49cc2d51c09c75c35433c3a1945d04 인데
스트링으로 그대로 입력하면 64 char 되므로 32byte가 아니다.
보이는 것만 hex format
https://www.blockchain.com/explorer/blocks/btc/500000
#500000 자료로 다시 테스트
날짜를 숫자로 바꾸는 곳은 여기
https://www.epochconverter.com/
Epoch timestamp: 1513654525
Timestamp in milliseconds: 1513654525000
Date and time (GMT): 2017년 December 19일 Tuesday AM 3:35:25
Date and time (your time zone): 2017년 12월 19일 화요일 오후 12:35:25 GMT+09:00
서버에서 보여주는 것이 Local 기준이라면
Epoch timestamp: 1513622125
Timestamp in milliseconds: 1513622125000
Date and time (GMT): 2017년 December 18일 Monday PM 6:35:25
Date and time (your time zone): 2017년 12월 19일 화요일 오전 3:35:25 GMT+09:00
이제 여기에 MSB/LSB 문제가
2025.01.10
영어로 비트코인 헤더 예제 구글링
https://developer.bitcoin.org/reference/block_chain.html
An example header in hex:
02000000 ........................... Block version: 2
b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... Hash of previous block's header
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... Merkle root
24d95a54 ........................... [Unix time][unix epoch time]: 1415239972
30c31b18 ........................... Target: 0x1bc330 * 256**(0x18-3)
fe9f0864 ........................... Nonce
L->M 이면 멤버의 순서도 바꿔야 될 것 같다.
Web SHA256에 넣기위해 bit/little edian 코드를 물어봤다.
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <string>
// 헥스 문자열을 바이트 배열로 변환하는 함수
std::string hexToBytes(const std::string& hex) {
std::string bytes;
bytes.reserve(hex.size() / 2);
for (std::size_t i = 0; i < hex.size(); i += 2) {
unsigned byte;
std::istringstream hexByte(hex.substr(i, 2));
hexByte >> std::hex >> byte;
bytes.push_back(static_cast<char>(byte));
}
return bytes;
}
// 바이트 배열을 big endian으로 변환하는 함수
std::string toBigEndian(std::string& bytes) {
std::reverse(bytes.begin(), bytes.end());
return bytes;
}
// 바이트 배열을 헥스 문자열로 변환하는 함수
std::string bytesToHex(const std::string& bytes) {
std::ostringstream hex;
for (unsigned char byte : bytes) {
hex << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(byte);
}
return hex.str();
}
int main() {
std::string hexString = "0a1b2c3d";
std::string bytes = hexToBytes(hexString);
std::string bigEndianBytes = toBigEndian(bytes);
std::string bigEndianHexString = bytesToHex(bigEndianBytes);
std::cout << "Original Hex String: " << hexString << std::endl;
std::cout << "Big Endian Hex String: " << bigEndianHexString << std::endl;
return 0;
}
구글링 하다가 제대로 된 정보를 찾았다.
Little Endian & Double SHA256 이 핵심
Double SHA256 = SHA256(SHA256(Header))
파트 | Little Endian 으로 만들기 → 바이트 순서 반대로 |
version | 0x01000000 |
previous block hash | 0xbddd99ccfda39da1b108ce1a5d70038d0a967bacb68b6b63065f626a00000000 |
merkle root | 0x44f672226090d85db9a9f2fbfe5f0f9609b387af7be5b7fbb7a1767c831c9e99 |
time | 0x5dbe6649 |
difficulty bits | 0xffff001d |
nonce | 0x05e0ed6d |
위 값들로 계산될 해시값 | 0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449 |
- https://www.unixtimestamp.com/
위의 영문 싸이트에서의 예제도 테스트
02000000b6ff0b1b1680a2862a30ca44d346d9e8910d334beb48ca0c00000000000000009d10aa52ee949386ca9385695f04ede270dda20810decd12bc9b048aaab3147124d95a5430c31b18fe9f0864
=>
2837af674e81436b09e0c937e94d96fe32e5c872391ba1090000000000000000
'IT' 카테고리의 다른 글
[드론] 각종 정보: 자격 종류, 교육, 비행가능 지역 (0) | 2025.01.09 |
---|---|
[드론] DJI Mini 완제품 vs MJX 업그레이드 비교 (0) | 2025.01.09 |
[프린터] SL-C1454FW 색상 보정 (0) | 2025.01.07 |
[마우스] 광학 센서 분해 (0) | 2025.01.05 |
[현미경] FHD 500x & 200x + YIZHAN 테스트 (0) | 2025.01.04 |