Transactions

創建一個雙 sha256 塊和交易

  • December 12, 2019

我有同樣的問題,用 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());

引用自:https://bitcoin.stackexchange.com/questions/85571