創建一個雙 sha256 塊和交易
我有同樣的問題,用 C++ 創建事務和塊的雙 sha256。
它由這些數據的串聯創建的雜湊塊,
版本+ previusBlock + merkleRoot + timeStamp + bit + nonce
在雜湊塊中沒有必要包含所有數據原始事務,因為它包含在 merkleRoot 中,對嗎?
對於創建,雜湊交易是通過這些數據的連接創建的, versionRawTransaction +交易輸入的輸出+ scriptSing +序列交易輸入+ cAmmount 交易輸出+ publicKeyScript + lockTime 原始交易
還是包含用於保存變數結構的數據?在這個方法中
numberRawTransactions + versionRawTransaction + numbarTransactionInput +交易輸出輸入+ scriptLenght + scriptSing +序列交易輸入+ numbarTransactionOutput + cAmmount 交易輸出+ publicKeyScriptLenght + publicKeyScript + lockTime 原始交易
現在我嘗試在我的 C++ 程序中應用這個理論,但無法獲得所需的雜湊值。你能幫助我嗎?
這是我的測試程式碼
TEST(hash_test, first_test_double_sha_bit_genesi_block_bitcoin_crypolibrary) { //Init logger FLAGS_minloglevel = 0; FLAGS_logtostderr = true; google::SetLogDestination(google::GLOG_WARNING, "/home/vincenzo/Github/SpyCblock/test/log/first_test_sha_not_on_bitcoin_protocolo.log"); string version = "01000000"; string previusBlock = "0000000000000000000000000000000000000000000000000000000000000000"; string merkleRoot = "3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"; string timeStamp = "29ab5f49"; string bit = "ffff001d"; string nonce = "1dac2b7c"; stringstream stream; stream << version << previusBlock << merkleRoot << timeStamp << bit << nonce; Bytes byte = asciiBytes(stream.str().c_str()); Sha256Hash shaHash = Sha256::getDoubleHash(byte.data(), byte.size()); LOG(INFO) << "The hash genesi block converting with double sha256: " << shaHash.ToString(); ASSERT_EQ(shaHash.ToString(), "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"); }
但我得到了這個結果
46f4d3f53251d05ab58a3f8925ce7023f2115dc38468ec78521c7d0e1dc7bd19
由於我在實踐中對密碼學幾乎一無所知,因此我依靠這個庫,在這裡我使用了這種類型的數據,這使得雙 sha256在此處查找
對不起我糟糕的英語,但我正在學習
問題是您正在散列塊頭字節的十六進製表示的字元串,而不是塊頭本身的字節。您需要對塊頭本身的字節進行雜湊處理。
您需要將所有內容設置為字節數組,而不是字元串。所以你會對整個塊頭有這樣的東西:
Byte[] block_header = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2, 0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61, 0x7f, 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x29, 0xab, 0x5f, 0x49, 0xff, 0xff, 0x00, 0x1d, 0x1d, 0xac, 0x2b, 0x7c};
可以使用此程式碼將字元串十六進制轉換為 C++ 中的矩陣字節
vector<unsigned char> ToHexIntoVectorByte(string &hexData) { vector<unsigned char> *bytes = new vector<unsigned char>(); for(unsigned i = 0; i < hexData.length(); i += 2) { string byteSubString = hexData.substr(i, 2); unsigned char byte = (unsigned char)strtol(byteSubString.c_str(), NULL, 16); bytes->push_back(byte); } return *bytes; }
用於提取無符號字元中的矩陣,
vectorresult.data()
如果使用比特幣密碼庫,則最終程式碼為vector<unsigned char> vectorByte = ToHexIntoVectorByte(stringHex); Sha256Hash shaHash = Sha256::getDoubleHash(vectorByte.data(), vectorByte.size());