์๋ ํ์ธ์! KEEP!T์ ๋๋ค. ์ต์ด์ ์ํธํํ์ธ ๋นํธ์ฝ์ธ์ ๋๊ตฌ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก '๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ'๋ผ๋ ์ฃผ์ ๋ก ์ฝํ ์ธ ๋ฅผ ์ฐ์ฌํ๊ณ ์์ต๋๋ค. ์ง๋ '๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ 3ํธ'์์๋ ๋นํธ์ฝ์ธ์ ๋ธ๋ก์ฒด์ธ ๊ตฌ์กฐ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ํน์ ์์ ๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ ์๋ฆฌ์ฆ๋ฅผ ์ฝ์ง ์์ผ์ จ๋ ๋ถ๋ค์ ์๋์ ๋งํฌ๋ฅผ ํตํด ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋นํธ์ฝ์ธ์ ๋ธ๋ก๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ธ๋ก ํด์, ๋ธ๋ก ํค๋, ๋ธ๋ก ๋ฐ๋ ์ ๋ณด๋ก ๋๋์ด๋ณผ ์ ์์ผ๋ฉฐ, ๋ธ๋กํค๋๋ ๋ฒ์ (Version), ์ด์ ๋ธ๋ก ํด์(Previous block hash), ๋จธํด ๋ฃจํธ(Merkle Root), ํ์(Time), ๋์ด๋ ๋ชฉํ(bits), ๋
ผ์ค(Nonce) ์ ๋ณด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ง๋ ๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ 3ํธ์์๋ ๋ฒ์ , ์ด์ ๋ธ๋ก ํด์, ๋จธํด ๋ฃจํธ ์ ๋ณด์ ๋ํด ์์๋ดค์ผ๋ฉด ์ด๋ฒ ์๊ฐ์๋ ์ง๋ ์๊ฐ์ ์ด์ด์ ํ์, ๋์ด๋ ๋ชฉํ(bits), ๋
ผ์ค(nonce) ์ ๋ณด์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ์ ์ ๋ณด๋ ๋ธ๋ก์ด ์์ฑ๋ ์์ ์ ์๊ฐ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ฉฐ, ์ ๋์ค ๊ธฐ์ค์ผ์๋ก ํ์๋ฉ๋๋ค. (1970๋ 1์ 1์ผ ์์ ๋ถํฐ ๊ฒฝ๊ณผํ ์๊ฐ์ ์ด ๋จ์๋ก ๊ณ์ฐํ ๊ฐ) ๋ํ, ํ์ ์ ๋ณด๋ ์๋ก์ด ๋ธ๋ก์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ฉฐ, ์๋ก์ด ๋ธ๋ก์ ํ์ ์ ๋ณด๋ ์ด์ ๋ธ๋ก์ ํ์ ์ ๋ณด๋ณด๋ค ํฌ๋ฉด์ 2์๊ฐ ์ด๋ด์ ๋ธ๋ก์ด์ด์ผ ํฉ๋๋ค.
๋นํธ์ฝ์ธ ๋คํธ์ํฌ์์ ์๋ก์ด ๋ธ๋ก์ ํ๊ท 10๋ถ์ ํ ๋ฒ์ฉ ์์ฑ๋ ์ ์๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๋์ด๋ ๋ชฉํ(bits) ์ ๋ณด๋ ๋ธ๋ก์ด 10๋ถ์ ํ ๋ฒ์ฉ ์์ฑ๋ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค. ๋์ด๋๋ชฉํ(bits) ์ ๋ณด๋ 2์ฃผ์ ํ ๋ฒ์ฉ ๋ณ๊ฒฝ๋๋ฉฐ, ์ง๋ 2์ฃผ ๋์ ๋นํธ์ฝ์ธ ๋คํธ์ํฌ์ ํด์ ํ์์ ์ํด ํ๊ท ์ ์ผ๋ก ๋ธ๋ก์ด ์์ฑ๋ ์๊ฐ์ ๊ณ์ฐํ์ฌ, ๋ค์ 2์ฃผ ๋์์๋ ๋ธ๋ก์ด 10๋ถ์ ํ ๋ฒ์ฉ ์์ฑ๋ ์ ์๋๋ก ๋์ด๋๋ฅผ ์กฐ์ ํ๊ฒ ๋ฉ๋๋ค.
๋ ผ์ค(Nonce) ์ ๋ณด๋ ์ฑ๊ตด(๋ง์ด๋)๊ณผ ๋ฐ์ ํ ๊ด๊ณ๊ฐ ์๋ ๊ตฌ์ฑ์์์ ๋๋ค. ๋ ผ์ค(Nonce)๋ ๊ฐ ๊ทธ ์์ฒด๋ก๋ ์๋ฌด๋ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง, ํด์ ํจ์์ ํน์ง์ ํ์ฉํ์ฌ ์์ ์ฆ๋ช (Proof-of-Work) ๋ฐฉ์์ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ง๋ ์ ์๋๋ก ๋์์ฃผ๋ ์์ฃผ ์ค์ํ ๊ตฌ์ฑ์์์ ๋๋ค.
๋์ด๋ ๋ชฉํ(bits) ์ ๋ณด์, ๋ ผ์ค(Nonce) ์ ๋ณด๋ ์ฑ๊ตด(๋ง์ด๋)ํธ์์ ์กฐ๊ธ๋ ์ฌ๋์๊ฒ ๋ค๋ฃจ๋๋กํ๊ฒ ์ต๋๋ค.
๋ธ๋ก ํด์ ์ ๋ณด๋ ์ด์ ๋ธ๋ก ํด์์ ์ฐธ์กฐ ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ๋ธ๋ก์ ์๋ณ์ ์ญํ ์ ์ํํฉ๋๋ค. ๋ธ๋ก ํด์ ์ ๋ณด๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ธ๋ก ํค๋(๋ฒ์ , ์ด์ ๋ธ๋ก ํด์, ๋จธํด๋ฃจํธ, ํ์, bit, nonce)์ ๋ณด๋ฅผ ํ ๋๋ก ๊ฐ์ ๊ตฌํ ์ ์์ต๋๋ค.
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ธ๋ก์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ ์๋ก ์ฐ๊ด ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ผ๋ถ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ํด์ ํจ์์ ๋๋ฏธ๋ ธ ํจ๊ณผ๋ก ์ธํ์ฌ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ด, ์ด๋ ํ ๊ฐ์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ ๋นํธ์ฝ์ธ ๋ง์ด๋ ์๋ฆฌ์ฆ๊ฐ ๋๋ ์์ ์์ ์ด์ผ๊ธฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. ๋นํธ์ฝ์ธ ๋ง์ด๋ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋ธ๋ก ํด์ ์ฐ์ฐ๊ณผ์ ์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
๋ธ๋กํด์ ์ฐ์ฐ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ง๋ ๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ 3ํธ์์ ์ธ๊ธํ ์๋์์ ๊ฐ๋ ์ ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. (๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ 3ํธ)
๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์งํ๋ฉ๋๋ค.
๋ธ๋ก ํด์ ์ ๋ณด๋ฅผ ๊ตฌํ๋ ์ฐ์ฐ๊ณผ์ ์ ๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ํํํ๋ฉฐ, ๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ฐ์ฐ๊ณผ์ ์ผ๋ก ์งํ๋ฉ๋๋ค. ์์ ์ฐ์ฐ ๊ณผ์ ์ ํตํด ๋ธ๋ก ํด์ ์ ๋ณด๊ฐ ์ ์์ ์ผ๋ก ๊ตฌํด์ง๋์ง ๊ฒ์ฆํ๊ธฐ ์ํ์ฌ, ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ์ฐ์ฐ ๊ณผ์ ์ ๊ฒ์ฆํ๊ธฐ ์ํด ๋ธ๋ก์ฒด์ธ ์ธํฌ์ฌ์ดํธ์์ ์ ๊ณตํ๋ API๋ฅผ ํ์ฉํ์ฌ ์ค์ ๋นํธ์ฝ์ธ ๋ฉ์ธ๋ท์ #508217๋ฒ์งธ ๋ธ๋ก ์ ๋ณด๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
๋ธ๋ก์ฒด์ธ ์ธํฌ ์ฌ์ดํธ์์๋ ๋ธ๋ก์ ์์ธ์ ๋ณด๋ฅผ Json ํํ๋ก ์ฝ๊ฒ ๊ฐ์ ธ๊ฐ ์ ์๋๋ก API๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ์๋์ URL ์ ๋ณด์์
bolck-height/๋ค์ ์๋ ์ซ์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ธ๋ก์ Height์ ๋ฐ๋ผ ์์ธ ์ ๋ณด๋ฅผ ์์ฒญํ ์ ์๊ฒ ๋ฉ๋๋ค. (๊ถ๊ธํ์ ๋ถ๋ค์ ์๋์ URL์ ๋ธ๋ผ์ฐ์ ์ฃผ์ ์ ๋ ฅ์ฐฝ์ ์ ๋ ฅํด๋ณด์ธ์!
{
"blocks": [
{
"hash": "000000000000000000081759445e2a44cb808c2b5e144c41d5d24d8fe7149269",
"ver": 536870912,
"prev_block": "00000000000000000060e66690d8a6646b7f8bb4aeb3fa7be258ae4011e362b5",
"mrkl_root": "98f0bb94fc154733f22ac54994e9637981900fcee8a0db7d5880b5b79ca3853d",
"time": 1518070436,
"bits": 392292856,
"fee": 100861384,
"nonce": 2699712111,
"n_tx": 1338,
"size": 1040139,
"block_index": 1671288,
"main_chain": true,
"height": 508217,
"tx":[
....
]
}
]
}
์์ Json ๋ฐ์ดํฐ์ค ๋ธ๋กํค๋ ์ ๋ณด๋ง์ ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
hash(๋ธ๋ก ํด์) : 000000000000000000081759445e2a44cb808c2b5e144c41d5d24d8fe7149269prev_block(์ด์ ๋ธ๋กํด์) : 00000000000000000060e66690d8a6646b7f8bb4aeb3fa7be258ae4011e362b5mrkl_root(๋จธํด๋ฃจํธ) : 98f0bb94fc154733f22ac54994e9637981900fcee8a0db7d5880b5b79ca3853dtime(ํ์) : 1518070436bits(๋์ด๋ ๋ชฉํ) : 392292856nonce(๋
ผ์ค) : 2699712111๋ธ๋ก #508217 ํค๋ ์ ๋ณด๋ฅผ ํ ๋๋ก ๋นํธ์ฝ์ธ ์ํค ์ฌ์ดํธ์์ ์ ๊ณตํ๋ ๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ PHP ์์ ์์ค๋ฅผ ์์ฉํ์ฌ ํด๋น ๋ธ๋ก ์ ๋ณด๋ก ๋์ ํ ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
<?
function SwapOrder($in){
$Split = str_split(strrev($in));
$x='';
for ($i = 0; $i < count($Split); $i+=2) {
$x .= $Split[$i+1].$Split[$i];
}
return $x;
}
function littleEndian($value){
return implode (unpack('H*',pack("V*",$value)));
}
function hextobin($hexstr)
{
$n = strlen($hexstr);
$sbin="";
$i=0;
while($i<$n)
{
$a =substr($hexstr,$i,2);
$c = pack("H*",$a);
if ($i==0){$sbin=$c;}
else {$sbin.=$c;}
$i+=2;
}
return $sbin;
}
//-- Block #508217 ํค๋ ์ ๋ณด
$ver = 536870912;
$prev_b = '00000000000000000060e66690d8a6646b7f8bb4aeb3fa7be258ae4011e362b5';
$mrkl_r = '98f0bb94fc154733f22ac54994e9637981900fcee8a0db7d5880b5b79ca3853d';
$time = 1518070436;
$bits = 392292856;
$nonce = 2699712111;
//1-1. version, time, bits, nonce ์ ๋ณด๋ฅผ ๋ฆฌํ ์๋์ ํํ๋ก ๋ณํ.
$ver = littleEndian($ver);
$time = littleEndian($time);
$bits = littleEndian($bits);
$nonce = littleEndian($nonce);
//1-2. ์ด์ ๋ธ๋ก ํด์, ๋จธํด๋ฃจํธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฐ๋ ์์๋ก ๋ณํ
$prev_b = SwapOrder($prev_b);
$mrkl_r = SwapOrder($mrkl_r);
//2. ๋ธ๋ก ํค๋ ์ ๋ณด๋ฅผ ๋ชจ๋ ํฉ์ฐ(์์๊ฐ ๊ผญ ๋ง์์ผํฉ๋๋ค.)
$header = $ver . $prev_b . $mrkl_r . $time . $bits . $nonce;
//3. ๋ฐ์ด๋๋ฆฌ ํํ๋ก ๋ณํ
$header_bin = hextobin($header);
//4. SHA256 ํด์ ๊ฐ ์ถ๋ ฅ ํ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ก ๋ณํ
$hasing_1 = hextobin(hash('sha256', $header_bin ));
//5. SHA256 ํด์ ๊ฐ ์ถ๋ ฅ
$hasing_2 = hash('sha256', $hasing_1);
//6. ๊ฒฐ๊ณผ ๊ฐ์ ์ค์(๋ฆฌ๋ฒ์ค)
$block_hash = SwapOrder($hasing_2);
//-- ํ๋ฉด์ ๊ฒฐ๊ณผ ๊ฐ ์ถ๋ ฅ
echo $block_hash;
?>
๋ธ๋ก #508217์ ๋ธ๋ก ํด์ ์ ๋ณด์, ์์ ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
๋นํธ์ฝ์ธ ์ํค ์๋ฌธํ์์๋ ๋นํธ์ฝ์ธ์ ๊ดํ ๋ง์ ๋ด์ฉ์ ๋ค๋ฃจ๊ณ ์์ผ๋ฉฐ, ๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๋ด์ฉ๋ ์์ธํ ์์ ๋์ด ์์ต๋๋ค. ํน์ ๋ณด๋ค ๋ ์์ธํ ์ฌํญ์ ์๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด ์๋์ ๋งํฌ๋ฅผ ๋จ๊ฒจ๋๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ธ๋ก ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์ฐ์ฐ ๊ณผ์ ์ ๋ํ ๋ชจ๋ ์์๋ฅผ ๋ค ์ดํดํ์ง ์๋๋ผ๋, ์ฐ์ฐ ๊ณผ์ ์ ํ๋ฆ์ ์ดํดํ๊ณ ์์ด์ผ๋ง ๋นํธ์ฝ์ธ ๋ง์ด๋ ํธ์ ์ฝ๊ฒ ์ดํดํ ์ ์์ผ๋ฉฐ, ๋นํธ์ฝ์ธ ๋ง์ด๋ ๊ณผ์ ์ ์ดํดํ ๊ฒฝ์ฐ ์ ๋นํธ์ฝ์ธ์ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ด ์์ ์ฆ๋ช ๋ฐฉ์์ธ์ง์ ๋ํ ๋ช ํํ ์ดํด๋ฅผ ํ ์ ์์ต๋๋ค.
์ด์์ผ๋ก ๋นํธ์ฝ์ธ ๋ฝ๊ฐ๊ธฐ 4ํธ์ ๋ง์น๋ฉฐ, ๋ค์ 5ํธ์์๋ ๋นํธ์ฝ์ธ ๋ง์ด๋ ์๋ฆฌ์ ๋ํ ํฌ์คํ ์ผ๋ก ์ฐพ์๋ต๋๋ก ํ๊ฒ ์ต๋๋ค.
yahweh87
https://en.bitcoin.it/wiki/Block_hashing_algorithm
์ด ์ ์๋ฌผ์ ํฌ๋ฆฌ์์ดํฐ๋ธ ์ปค๋จผ์ฆ ์ ์์ํ์-๋น์๋ฆฌ-๋ณ๊ฒฝ๊ธ์ง 4.0 ๊ตญ์ ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ์ด์ฉํ ์ ์์ต๋๋ค.