์๋ ํ์ธ์. ๊ธธ๋ผ์์ ๋๋ค.
STEEMIT์ ๋ฒ ํ๋ฒ์ ์ด๋ผ ์์ ์ ์ฅ๋ ์๋๊ณ , ํ๊ตญ๋ง๋ก ๋์ด์๋ ์ปจํ ์ธ ๋ ๋๋ถ๋ถ ๊ฐ์ํํ์ ํ์ ๋์ด ์๋ ํธ์ด์ง๋ง, ์๋ฌด๋๋ ๋ค๋ฅธ ๊ฐ์ํํ์ ๋ฒ์ง๋ฅด๋ฅดํ ๋ก๋๋งต๋ณด๋ค๋ ๋๋ฆ์ ์ํ๊ณ์ ๊ตฌํ๋ฌผ์ด ์ค์ ๋ก ๋์ ๋ณด์ฌ์ ๋คํ์ ๋๋ค.
๊ธฐ์กด์ ์ฝ์ธ ์ฝ๋๋ค์ ๋ํด ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ๊ณ ๊ฒ์ฆ์ ํ๋ ์์ ์ ํตํด ์ผ์ข ์ ์ ์ฉํ๊ฐ๋ฅผ ํด๋ณด๊ณ ์ถ์ด STEEMIT์ ์์ํ์์ต๋๋ค.
๋ค๋ง, ๊ทธ ์ฒ์์ ๋ฌด์กฐ๊ฑด ๋นํธ์ฝ์ธ์ด ๋์ด์ผํฉ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ์์ํ ๊ฒ์ ๋นํธ์ฝ์ธ์ ๋๋ค.
๋ฐ๋ก ์๋ ๋จ 9์ฅ์ ํ์ดํผ๋ ํํ์ ์ญ์ฌ๋ฅผ ๋ฐ๊ฟ๋ฒ๋ฆฝ๋๋ค.
์ ์์ธ ์ฌํ ์ ๋์นด๋ชจํ ๋ ์ฒ์๋ถํฐ ์ต๋ช ์ผ๋ก ์์ํ๊ฒ์ผ๋ก ๋ณด์ ์์ ์ด ๋ฏธ์น ํ๊ธ๋ ฅ์ ๋ํ ์ง์์ ์ด๋์ ๋ ์์์๊น์? ๋ ผ๋ฌธ์ ๋ผ๋๋ ์์ ์ ์ด๋ฆ์ ์๋ฆฌ๊ณ ์ ํ๋ ๋ชฉ์ ์ด ํฝ๋๋ค. ์ 1์ ์, ์ 2์ ์ ๋ฑ ๊ต์ฅํ ์๋ฏผํ๊ณ ์์ฌ๋ง์ ์ด์์ธ๋ฐ ๊ตณ์ด ์ต๋ช ์ผ๋ก ์ฌ๋ ธ์๊น์..
์ด ๊ธ์์๋ ๋นํธ์ฝ์ธ์ ์ํ๋ฒ์ ์ ๊น๋ณด๋ฉฐ ๊ทธ ์์ค๋ฅผ ์ดํดํ๋ ๊ฒ์ผ๋ก ๊ฐ์ํํ์ ์ดํด๋ฅผ ์์ํ๊ณ ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํํ์ด์ง๋ง ๊ทธ๋ด๋ฏํ๊ฒ ๋ง๋ค์ด์ ํํ ๋ ธ๋ฆฌ๋ ์ฌ๊ธฐ ์ฝ์ธ๋ค์ ์ฅ์์๋ฅผ ํธ์ด๋ฒ๋ฆฌ๋๋ฐ ์ผ์กฐํ๊ณ ์ ํฉ๋๋ค.
๊ฝค ๋ง์ ๋ถ๋ถ์ ์๋์ ์ฑ ์ ์ฐธ๊ณ ํ์์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ์๋ฏธ๊ฐ ์๋ ์ฑ ์ด ๊ทธ๋ ๊ฒ ๋ง์ง๋ ์์๋ฐ ์ ์ฑ ์ ์คํ๋ง ํ๋ คํ ๊ฒฝ์ ๊ตฌ๋ฃจ๊ฐ ๋์์ ๋ฌ๊ตฌ๋ฆ ์ก๋๊ฒ์ด ์๋, ์ค์ ๊ธฐ์ ์ ๋ํ ๋ด์ฉ์ด ์ค๋ ค์์ผ๋ ๊ตฌ์ ํ์ฌ ๋ณด์ ๋ ๋ ๋ฏํฉ๋๋ค. ์ด๋ฐ์ ๋ค๋ฅธ ๊ธฐ์ ์์ ์ ์์ค์ ๊น์ด์๋๊ฒ๋ค์ด ๋ง์ด ์์ต๋๋ค.
๋นํธ์ฝ์ธ์ ์ฝ๋๋ github์์ ๋ฐ๋ก ๋ค์ด๋ก๋๋ฐ์ผ์ค์ ์์ต๋๋ค. ๋ชจ๋ ์ฝ๋๋ ์ฌ๊ธฐ์ ๊ด๋ฆฌ๊ฐ ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ git์ ํตํด ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋๋ฐ ๋นํธ์ฝ์ธ๋ ๋ง์ฐฌ๊ฐ์ง๊ณ ๊ฑฐ๊ธฐ์ ํ์๋ ๋ชจ๋ ์ฝ์ธ๋ค์ ๋๋ถ๋ถ ์ ์ ์ ์ด๋ผ๋ฉด ์ด๊ณณ์ ํตํด ๊ณต๊ฐํ๊ณ ๋ ํฉ๋๋ค.
๋นํธ์ฝ์ธ์ star์์ fork์๋ ์์๊ฐ์ต๋๋ค. ์ค์บ ์ฝ์ธ์ด ์๋๋ผ๋ฉด ์ด๋ ๊ฒ star๊ฐ ๋ง์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ข์์์ธ๋ฐ, ๋ง์น ํ์ด์ค๋ถ์ฒ๋ผ ์๋ณธ์ ๋ผ์ดํฌ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌ (ํฌํฌ) ํด์ ๊ฐ์ ธ๋ค ๋์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๊ธธ๋ผ์์ด ๋ง๋ ๊ฐ์ฆ์์ฝ์ธ์ ๋๋ค. ์ฐธ ์ฝ์ฃ ? star๋ ํ๊ฐ๋ ์์ผ๋ fork๋ ์๋ณธ์ ๋ฐ๋ผ๊ฐ๋๋ค. ์ด๋ฆ์ง๊ธฐ๋ ์ฝ์ต๋๋ค. ๊ทธ๋ฅ ๊ฐ์ ธ์์ ํ ์ฌ๋ผ์์ด๋ ์์ธXXX์ด๋ ์ปค๋จผ๋ฒ ์ด๋น์ํผํฌ๋ฆฝํ ์ปค๋ ์์ค๋ฒกํฐ๋งจ์ด๋ ์ด๋ฆ๋ถ์ฌ๋์ด๋์ผ๋ฉด ์ฅ๋ก์ ๋๋ค.
์ฝ๋๋ฅผ ๋ณต์ฌํ๊ธฐ ์ด๋ ๊ฒ ์ฝ๋ค๋๊ฑด ๋์ถฉ ์์๊ณ ์๊ฐ์์ผ์๋ฉด ๋ผ์ดํธ์ฝ์ธ๋ ํ๋ฒ ํ์ธํด๋ณด์ธ์ ^^;
ํ์ฌ ๋นํธ์ฝ์ธ ์ฝ๋๋ 0.15 ๋ฒ์ ์ ๋์ด๊ฐ๊ณ ์๋ ์ํ์ ๋๋ค. ์ด์ง ์์ํ ๋ถ๋ถ์ ์์ง๋ 1๋ฒ์ ์ด๋ผ๋ ๋ฑ์ง๊ฐ ๋ถ์ฌ์ง์ง ์์๋ค๋ ๊ฒ์ ๋๋ค. ๊ด์ต์ ์ผ๋ก ์ ์ ๋ฆด๋ฆฌ์ฆ๋ฒ์ ์ด๋ฉด 1.X๋ก ์์ํ๊ธฐ ๋ง๋ จ์ด์ง๋ง, ๋นํธ์ฝ์ธ์์ฒด๋ ํ๋ํฌํฌ๊ฐ ์๋ฐ๋์ด์ผ ํ๋ ์ผ์ด๋ผ ์ค๋ฆฌ์ง๋ ๋นํธ์ฝ์ธ์ ๋ฒ์ ๋๋ฒ๊ฐ ๋์ง ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
ํ์ฌ๋ฒ์ ์ ์ด๊ฒ์ ๊ฒ ์์ค๊ฐ ์ถ๊ฐ๋์ด ์ดํดํ๊ธฐ๊ฐ ์๋นํ ์ด๋ ต์ต๋๋ค. ํนํ ์คํฌ๋ฆฝํธ ์ธ์ด๊ฐ์๋ C++๊ธฐ๋ฐ์ ์์ค๋ ๋ฐ๋ก ํ์คํ์ค ์ดํดํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ํ์์ผ๋ก ์ฌ๋ผ์ง ๋๊ฐ๋ชจํ ์ฌํ ์์ ์ฝ๋์ ์จ๊ฒฐ์ด ์ด์์๋ 0.1๋ ๋ฒ์ ์ ์ดํด๋ณด๋ฉด์ ๊ทธ ์จ๊ฒฐ์ ๋์๋ฅผ ํ๋ฒ ๋งก์๋ณผ ์์ ์ ๋๋ค. ์๋ด์ธ์ง ๊ฝํฅ๊ธฐ์ธ์ง ์ดํด๋ณด๋ฌ ๊ฐ๊น์.
$ git clone https://github.com/bitcoin/bitcoin.git
$ git checkout 4405b78d6059e536c36974088a8ed4d9f0f29898
๋นํธ์ฝ์ธ์ ์์ค๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ์ 10์ด๋ฉด ๋์ด ๋ฉ๋๋ค. ๋ค๋ง ์์ ์ ์ํ๋ฒ์ ์ผ๋ก ๋์๊ฐ๊ธฐ์๋ ์ํ๋ฒ์ ๋ธ๋์น๋ฅผ ์์์ผ ํ๋๋ฐ, ์์๊ฐ์ด ์ฒดํฌ์์์ ํ๋ฉด ์ํ๋ฒ์ ์ด ๋ถ๋ฌ์ ์ง๋๋ค.
๋นํธ์ฝ์ธ์ ํค๋ฅผ ๋ด์ ์ง๊ฐ์ ๋ง๋๋๊ฒ ๋งจ ์ฒ์์ ํด์ผํ ์ผ์ธ๋ฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ๋์ด์์ต๋๋ค.
// ui.cpp 1857
string strAddress = PubKeyToAddress(GenerateNewKey());
SetAddressBookName(strAddress, strName);
๋น์ฌ๋ฑ์์ ์ง๊ฐ์ผ๋ก ์ ์กํ๋ ค๋ฉด QR์ฝ๋๋ ์๋์ ๊ฐ์ ์ฃผ์๊ฐ ๋ฉ๊ทธ๋ฌ๋ ๋ ์๋๊ฑธ ์์์์ต๋๋ค. ์์ ์ฝ๋์์ ๋์จ strAddress๊ฐ ์๋์ ๊ฐ์๊ฒ๋๋ค. (์ ui.cpp์ธ๊ฐ ํ๋ฉด, ์ง๊ฐ์ฃผ์๋ง๋๋ ui๋ฅผ ๋ง๋ค์ด๋์๊ณ , ์ฌ๊ธฐ์ ํธํ๊ฒ ์ง๊ฐ์ฃผ์๋ฅผ ์์ฑ๊ฐ๋ฅํ๋๋ก ์ฌํ ์๊ฐ ํด๋์๋ค์.)
๊ทธ๋ ๋ค๋ฉด ์ด ์ฃผ์๋ ๋๋์ฒด ์ด๋์ ๋์ฌ๊น์? ์ผ๋จ ์ ๋ ์ ๋ ๊ฒ ์ ์ง๊ฐ์ ์ฃผ์๋ฅผ ์ด ๊ณต๊ฐ์ ๋ ธ์ถ์์ผ๋ฒ๋ ธ๋๋ฐ ์ํํ์ง๋ ์์๊น์? ๋ ธ๋ ธ, ์ด๊ฒ์
์ ๋๋ค. ์ด ๊ณผ์ ์ ๊ฑฐ๊พธ๋ก ์ ์ถํด๋ผ์๋ ์๊ณ ํ๋ํ๋ ์ผ์ผํ ๋๋ ค๋ฐ๋ ๋ฐฉ์์ด ์๋๋ฉด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ํ๋ํ๋ ๋๋ ค๋ฐ๊ธฐ๋ณด๋ค๋ ๊ทธ ์ปดํจํ ํ์๋ก ์ฐจ๋ผ๋ฆฌ ๋นํธ์ฝ์ธ์ ํ๋๊ฒ ๋ ๋์๊ฒ๋๋ค.
์ด ๊ณผ์ ์ ๋ค์์ ์ฝ๋๋ถํฐ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด ๋ฉ๋๋ค. ์ฝ๋ ์๋ณด์ค๋ถ์ ์ด๋ถ๋ถ ํจ์คํ์๋ฉด ๋ฉ๋๋ค.
// main.cpp 75
vector<unsigned char> GenerateNewKey()
{
CKey key;
key.MakeNewKey();
if (!AddKey(key))
throw runtime_error("GenerateNewKey() : AddKey failed\n");
return key.GetPubKey();
}
๊ณต๊ฐํค๋ฅผ ๋ค์ ํด์์ ๋ฃ๋ ๊ณผ์ ์ ๋ ์๋์ฝ๋์ ๋๊ฐ ์จ์ด์์ต๋๋ค. hash1, hash2์ ๊ฐ์ ๋ณ์ ๋ค์ด๋ฐ์ ๋ญ๊ฐ ์น์ํฉ๋๋ค๋ง, ๋ญ ๋ค๋ฅด๊ฒ ์ด๋ฆ์ง๊ธฐ๋ ๋ญํ๊ธฐ๋ ํฉ๋๋ค.
// util.h 392
inline uint160 Hash160(const vector<unsigned char>& vch)
{
uint256 hash1;
SHA256(&vch[0], vch.size(), (unsigned char*)&hash1);
uint160 hash2;
RIPEMD160((unsigned char*)&hash1, sizeof(hash1), (unsigned char*)&hash2);
return hash2;
}
๋ค์ ์ฝ๊ธฐ์ข์ ์ฃผ์๋ก ๋ณํํด์ฃผ๋ ๋ก์ง์ Hash160ToAddress() ์ฌ๊ธฐ ์๋ค์.
// base58.h 198
inline string PubKeyToAddress(const vector<unsigned char>& vchPubKey)
{
return Hash160ToAddress(Hash160(vchPubKey));
}
SHA256์ด๋ RIPEMD160 ์ ๋จ๋ฐฉํฅ ํจ์๋ก ์ฌ์ค ์์ดํ์ด ๋น๋ฐ๋ฒํธ ์ค์ ํ ๋ ์ฌ์ฉ ๋ณด์ ์ ์ด ์์๊ฒ๋๋ค. ์ฌํ ์๋ ํ๊ฐ์ ํจ์๋ก๋ ๋ถ์ํ๋์ง ์์๊ฐ์ด SHA256์ ํต๊ณผ์ํค๊ณ ์ด๋ฅผ ๋ค์ RIPEMD160ํจ์์ ํต๊ณผ์ํต๋๋ค. ์ด๋์ ํด์ํจ์ ๋ํ๋ผ๋ ์ด์ผ๊ธฐ๊ฐ ๋์ค๋๋ฏ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผํตํด ๋์จ ์ฃผ์๊ฐ ๋๋ฌธ์ i๋ l๋ฑ๊ณผ ๊ฐ์ ๋ถ๋ถ์์ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ์ธํ ํด๋์ base58check์ธ์ฝ๋ฉ์ผ๋ก ๋ค์ํ๋ฒ ๋ฐ๊ฟ์ค๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด ์ด๊ฒ์ ๋๋ค. ๋๋ง์๊ณ ์๋ ๋น๋ฐ๋ฒํธ๋ก๋ถํฐ ๋ญ ์ด์ํ ํจ์๋ฅผ ํต๊ณผ์์ผ ์ฃผ์๋ฅผ ๋ง๋ค์ด๋ ๋๋ค. ์ด ์ฃผ์๋ ๋์ ๊ณต๊ฐ์ ์ธ ์ฃผ์๋ก ์ฐ์ ๋๋ค. ๋๊ตฐ๊ฐ ๋๋์ ์ด ์ฃผ์์์ ๋์ ๋นผ๋ด๋ ค๊ณ ํด๋ ๋ด๊ฐ ์ด๊ธฐ์ ์ธํ ํ ๊ฐ์ธํค๋ฅผ ๋ชจ๋ฅด๊ธฐ๋๋ฌธ์ ๋ง์งฑ๋๋ฃจ๋ฌต์ ๋๋ค.
๊ทธ๋์ ์ต์ข ์ ์ผ๋ก ํ์ด๋์ค๋๊ฒ ์๋์ ๊ฐ์ ์ฃผ์์ ๋๋ค. i๋ l๊ณผ ๊ฐ์ ํท๊ฐ๋ฆฌ๋ ์ํ๋ฒณ์ ์ถํํ์ง ์์ต๋๋ค.
๋์ด ๋จ์๋์๋ ๋ถ์ ์ ์๊ฒ 100 ๋นํธ์ฝ์ธ์ ์ ์กํ์๋ฉด ๋ ๊ฒ๊ฐ๊ตฌ์.
์ํ๋ฒ์ ์์์ ํธ๋์ญ์ ์ ์ค์ํ ์ฝ๋๋ ์๋์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์กด์ฌํ๊ณ ์์ต๋๋ค. main.hํ์ผ์ ๋ค์ถฐ๋ณด๋ฉด ๋๋ต 100๋ผ์ธ๋ถํฐ ํ์ธํ ์ ์์ต๋๋ค. ์๋์ ๊ตฌ์กฐ๋ ํธ๋์ญ์ ์์ ์กด์ฌํ๋ ์ฌ๋ฌ ํด๋์ค๋ค์ธ๋ฐ ์ด๋ฅผ ํตํด ํธ๋์ญ์ ์ด ์ผ์ด๋ ๋ ์ค์ ์ ์ผ๋ก ์ด๋ค ๋ฐ์ดํฐ๋ค์ด ์ค๊ณ ๊ฐ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
CTransaction์ด๋ผ๋ ๊ฐ์ฒด ์๋์ ์ฃ๋ค ์ฃผ๋ ์ฃผ๋ ํธ๋์ญ์ ์ ๊ด๋ จํ ๋ฐ์ดํฐ๋ค์ด ๋ฌ๋ ค์์ต๋๋ค.
์ค์ ๋ก ๊ฑฐ๋๋ฅผ ๋ ๋ฆฌ๋๋ฐ์ ๋ก์ง์ ์ดํด๋ณด๋๊ฒ์ ui.cpp์ ์จ๊ฒจ์ ธ์๋ onButtonSend()๋ผ๋ ๋ก์ง์ ์ฐธ๊ณ ํด๋ณผ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ํ ๋ก์ง ๋นผ๊ณ ๋ ์ฃ๋ค ๋ ๋ฆฌ๊ฑฐ๋ ๋ฐ๊ฟ๋ฒ๋ฆฌ๊ฒ ์ต๋๋ค. ๊ด์ฌ์๋ ๋ถ๋ค์ ui.cpp๋ด๋ถ์ 1368๋ผ์ธ์ ์ฐธ๊ณ ํ์๋ฉด ์ค์ ๋ก ๋นํธ์ฝ์ธ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค๋ ๋ ๋ ค์ผ ํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ํ์ผํ์ค์ ์์ต๋๋ค.
void CSendDialog::OnButtonSend(wxCommandEvent& event)
{
CWalletTx wtx;
// ์ ์ฃผ์๋ฅผ ์์๋ก ๋ฐ์๋ฃ์์ต๋๋ค.
string strAddress = '15aNzLEMd53hYXWUpw3exnyHJuVX2y9MiC';
// ์์กํ์ธ
int64 nValue = 0;
ParseMoney(strAddress->GetValue(), nValue)
if (nValue + nTransactionFee > GetBalance()) return;
// ๋นํธ์ฝ์ธ ์ฃผ์ ๊ฐ์ ธ์ค๊ธฐ
uint160 hash160;
bool fBitcoinAddress = AddressToHash160(strAddress, hash160);
// ์ฃผ์ ํ์์ด ๋ง์ผ๋ฉด
if (fBitcoinAddress) SendMoney(scriptPubKey, nValue, wtx)
}
์ค์ํ ํธ์ถ ๋ฉ์๋์ธ SendMoney() ๋ main.cpp์ 2657 ๋ผ์ธ์,
CreateTransaction() ์ 2544๋ผ์ธ์ ์กด์ฌํฉ๋๋ค.
bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew)
{
//ํธ๋์ญ์
์ ๋ง๋ค๊ณ
CreateTransaction(scriptPubKey, nValue, wtxNew, nFeeRequired);
//ํธ๋์ญ์
์ ์ปค๋ฐํฉ๋๋ค.
CommitTransactionSpent(wtxNew);
//ํธ๋์ญ์
์ด ๋ฐ์๋ค์ฌ์ง๋ค๋ฉด
wtxNew.AcceptTransaction();
//๋ค๋ฅธ ํผ์ด๋ค์๊ฒ ์ด๋ฅผ ์ ์กํฉ๋๋ค.
wtxNew.RelayWalletTransaction();
return true;
}
์ด์ ํธ๋์ญ์ ์ ๋ง๋ค์ด๋ณด๋ ๋ก์ง์ ์ดํด๋ด์ผ๊ฒ ์ฃ .
bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, int64& nFeeRequiredRet)
{
// ์์๋ฃ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
int64 nValueOut = nValue;
nValue += nFee;
// ์๋์ ์ํํ๋ฉด์ ๋ชจ์์ ํฉ๊ณ๋ฅผ ๋ง๋ค์ด ๋
๋๋ค.
set<CWalletTx*> setCoins;
int64 nValueIn = 0;
//์ด๋ setCoins๋ผ๋ set์๋ฃ๊ตฌ์กฐ์ ์ ์ฅ์ด ๋ฉ๋๋ค.
SelectCoins(nValue, setCoins);
foreach(CWalletTx* pcoin, setCoins) nValueIn += pcoin->GetCredit();
// ๋ชฉ์ ์ง์ธ ์ฃผ์์ธ scriptPubKey์ ๊ธ์ก์ ๋ฃ์ด๋์ต๋๋ค.
wtxNew.vout.push_back(CTxOut(nValueOut, scriptPubKey));
// ํฌ์
ํ๋ ๊ธ์ก์ด ์ง๋ถํ๋ ๊ธ์ก๋ณด๋ค ์๋ค๋ฉด ์๋์ ๊ฑฐ์ฌ๋ฌ ๋ฐ์์ผ๊ฒ ์ฃ ?
if (nValueIn > nValue)
{
//๋ฃจํ(์์๋ก ์๋ต) ๋ฅผ ๋๋ฉด์, ๋ด ์๋์ ๋ฐ๋ก ์ฑ๊ฒจ๋ก๋๋ค.
if (txout.IsMine()) ExtractPubKey(txout.scriptPubKey, true, vchPubKey);
//๊ทธ๋ฆฌ๊ณ ๋ณด๋ผ์ฌ๋์๊ฒ ์ค ๋๋ ๋ฐ๋ก ์ฑ๊ฒจ๋ก๋๋ค.
CScript scriptPubKey;
scriptPubKey << vchPubKey << OP_CHECKSIG;
wtxNew.vout.push_back(CTxOut(nValueIn - nValue, scriptPubKey));
}
// ๋ค์ ๋์๊ฒ ๋ค์ด์ค๋ ํธ๋์ญ์
์ ์ธํ
ํฉ๋๋ค.
foreach(CWalletTx* pcoin, setCoins)
for (int nOut = 0; nOut < pcoin->vout.size(); nOut++)
if (pcoin->vout[nOut].IsMine())
wtxNew.vin.push_back(CTxIn(pcoin->GetHash(), nOut));
// ๋์๊ฒ ๋์์ค๋ ๋๋ค์ ์ฌ์ธํฉ๋๋ค.
int nIn = 0;
foreach(CWalletTx* pcoin, setCoins)
for (int nOut = 0; nOut < pcoin->vout.size(); nOut++)
if (pcoin->vout[nOut].IsMine())
SignSignature(*pcoin, wtxNew, nIn++);
// ์ต์ํ์ ์์๋ฃ๋ฅผ ์ถฉ์กฑํ๋์ง ํ์ธํฉ๋๋ค.
if (nFee < wtxNew.GetMinFee(true))
{
nFee = nFeeRequiredRet = wtxNew.GetMinFee(true);
continue;
}
}
์ต์ ์์๋ฃ๋ ์ง์์ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ฐ, ์๋๋ฉด ๋ชจ๋ ๊ฑฐ๋๋ฅผ ํ๋ฒ ๋๋ฉด์ ๋ค ํฉ์น๋ฉด์ ๊ณ์ฐ ํด๋ณด์์ผ ์ต์ข ์ ์ผ๋ก ์ต์ข ์์๋ฃ๋ฅผ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณต์กํ ๋ฃจํ๋ฌธ์ ์ ๊ฐ ์์๋ก ์จ๊ฒจ๋ฒ๋ ธ์ผ๋, ์ด๋ถ๋ถ์ ์ง์ ๋ณด์๋ฉด ๋์ง๋ง ์ด๊ฒ๋ง ํ์ธํ๋ฉด ๋ฉ๋๋ค.
์ด ์ต์์์๋ฃ๋ฅผ ๊ณ์ฐํ๋ ๋ถ๋ถ์ด ๋ญ๊ฐ ๋ฒ์ ์ ์ด ๋์์๊ฒ๊ฐ์ ๋ถ์๊ธฐ๋ ๋์ง๋ง, ์ด์จ๋ ์ง๊ธ์ ๋ณด๋ผ๋๊ณผ ์๋, ๊ทธ๋ฆฌ๊ณ ์์๋ฃ๊น์ง ๊ณ์ฐํ๋ ๋ก์ง์ด ์จ์ด์์ต๋๋ค.
๊ฑฐ๋๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ถ๋ช ํ ๋ณธ์ธ์ ๊ฐ์ธํค๊ฐ ํ์ํ๊ณ ์ด ์์ด ๊ฑฐ๋๋ฅผ ์ผ์ผํค๋ ํ์๋ ๋นํธ์ฝ์ธ์ ์กด์ฌ์ด์ ๋ฅผ ์์ ๋ฒ๋ฆฝ๋๋ค. ์ด๋ script.cpp ์ 1090๋ผ์ธ์ ์กด์ฌํฉ๋๋ค.
bool SignSignature(const CTransaction& txFrom, CTransaction& txTo, unsigned int nIn, int nHashType, CScript scriptPrereq)
{
// ์ฌ์ธ๋ ํด์๋ฅผ ๋ฐ์์
uint256 hash = SignatureHash(scriptPrereq + txout.scriptPubKey, txTo, nIn, nHashType);
// ํด์๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ ์๊ทธ๋์ฒ๋ฅผ ์์ฑํฉ๋๋ค.
Solver(txout.scriptPubKey, hash, nHashType, txin.scriptSig);
// ์ต์ข
์ ์ผ๋ก ๊ฒ์ฌํ๋ ๋ก์ง์
๋๋ค.
EvalScript(txin.scriptSig + CScript(OP_CODESEPARATOR) + txout.scriptPubKey, txTo, nIn);
}
1ํธ์ ์ฌ๊ธฐ์ ๋ง๋ฌด๋ฆฌํฉ๋๋ค. ์์์ ์ธ๊ธํ๋ฏ์ด, Dissection of Bitcoin ์์ ํด๋นํ๋ ์ฝ๋์ ๋ํ ์ค๋ช ์ ์๋ฌธ(!) ์ผ๋ก ์ ํํ๊ณ ์์ธํ๊ฒ ํ์ธํ์ค ์ ์์ผ๋ฉฐ ์ฌ๊ธฐ์ ์๊ฐํ๋ ๋ก์ง์ ์ค์ ๋ก ๋์ํ๋ ์ฝ๋๊ฐ ์๋๋ฉฐ ์ดํด๋ฅผ ๋๊ธฐ์ํด (ํน์ ์ ๊ฐ ์ดํดํ๊ธฐ์ํด) ์ค์ํ ๋ก์ง๋ง ๋ฐ์์ต๋๋ค.
ํ์ฌ 0.15๋ฒ์ ์ ํ์ด๋ณด๋ฉด ์ํ๋ฒ์ ์ด ์ก์ง ๋ชปํ๋ ๋ค์ํ ์ํฉ๊ณผ ๊ตฌ์กฐ์ ์ธ ๋ชจ์์ ํจ์ฌ ์ก์๋์ ๋ชจ์์์ ๋๋ค. ์ฌ์ค ๊ทธ๋ฌ๋ค๋ณด๋ ์ฝ๋๋ถํฐ ๋ค์ฌ๋ค๋ณด๋ฉด ์ดํดํ๊ธฐ๊ฐ ํ๋ญ๋๋ค.
๋ง์ ํ๊ตญ ์คํํธ์ ๊ณผ ๋๊ธฐ์ ๋ค์ ๊ณ์ ๋ถ๋ค์ด ์ฝ์ธ ํน์ ํ ํฐ์ ์ด์ฉํด ๊ตญ์ ์ ์๋ณธ์ ๋์ด์ฌ์ ์์ผ๋ฉด ์ฐธ ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋๋ ํฌ๋ฆฌ์ค๋ง์ค์ ๋๋ค.
๊ทธ๋๊น์ง ๋ง์๋ถ๋ค์ด ๋์ ์์ง ์๊ณ ์์ธ๊ฐ ๋ฌด๋์ง์ง ์๊ธธ ๋น๋๋ค. ๊ณต๋ถ๋ฅผ ์ข๋ ํ๊ณ ๋ค์ ๊ณ์ ์ด์ด๋๊ฐ๊ฒ ์ต๋๋ค.