Skip to content

Instantly share code, notes, and snippets.

@dlgusdn616
Last active June 7, 2018 08:50
Show Gist options
  • Save dlgusdn616/2a3e7678659a7026a02ab41b4e61e003 to your computer and use it in GitHub Desktop.
Save dlgusdn616/2a3e7678659a7026a02ab41b4e61e003 to your computer and use it in GitHub Desktop.
CBlock::BuildMerkleTree
CBlock::BuildMerkleTree()
{
uint256 BuildMerkleTree() const
{
vMerkleTree.clear();
// 각 트랜잭션들의 해시값을 따로 저장하여 vMerkleTree 생성
foreach(const CTransaction& tx, vtx)
vMerkleTree.push_back(tx.GetHash());
int j = 0;
for (int nSize = vtx.size(); nSize > 1; nSize = (nSize + 1) / 2)
{
for (int i = 0; i < nSize; i += 2)
{
// 만약 트랜잭션이 짝수개가 아니라면, 마지막 트랜잭션의 해시는 자기 자신과 해시
int i2 = min(i+1, nSize-1);
// 트랜잭션의 해시를 2개씩 묶어서 다시 머클트리에 삽입한다.
vMerkleTree.push_back(Hash(BEGIN(vMerkleTree[j+i]), END(vMerkleTree[j+i]),
BEGIN(vMerkleTree[j+i2]), END(vMerkleTree[j+i2])));
}
// j는 각 트리레벨에 맞춰 삽입해야할 첫번째 위치를 가리킨다.
j += nSize;
}
return (vMerkleTree.empty() ? 0 : vMerkleTree.back());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment