Title: different version have different SignatureHash? Post by: zhengjianxun on July 30, 2018, 07:22:26 AM in bitcoin 0.1.5 : SignatureHash (txto-sig+scriptCode),but the scriptCode insert into the position of sig, but now i find in bitcoin 0.10,i find the scriptCode is append into the back!!!
in bitcoin 0.1.5 : 1: uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) 2: { 3: if (nIn >= txTo.vin.size()) 4: { 5: printf("ERROR: SignatureHash() : nIn=%d out of range\n", nIn); 6: return 1; 7: } 8: CTransaction txTmp(txTo); 9: // In case concatenating two scripts ends up with two codeseparators 10: // or an extra one at the end, this prevents all those possible incompatibilities. 11: scriptCode.FindAndDelete(CScript(OP_CODESEPARATOR)); 12: // Blank out other inputs' signatures 13: for (int i = 0; i < txTmp.vin.size(); i++) 14: txTmp.vin.scriptSig = CScript(); 15: txTmp.vin[nIn].scriptSig = scriptCode; 16: // Blank out some of the outputs 17: if ((nHashType & 0x1f) == SIGHASH_NONE) 18: { 19: // Wildcard payee 20: txTmp.vout.clear(); 21: // Let the others update at will 22: for (int i = 0; i < txTmp.vin.size(); i++) 23: if (i != nIn) 24: txTmp.vin.nSequence = 0; 25: } 26: else if ((nHashType & 0x1f) == SIGHASH_SINGLE) 27: { 28: // Only lockin the txout payee at same index as txin 29: unsigned int nOut = nIn; 30: if (nOut >= txTmp.vout.size()) 31: { 32: printf("ERROR: SignatureHash() : nOut=%d out of range\n", nOut); 33: return 1; 34: } 35: txTmp.vout.resize(nOut+1); 36: for (int i = 0; i < nOut; i++) 37: txTmp.vout.SetNull(); 38: // Let the others update at will 39: for (int i = 0; i < txTmp.vin.size(); i++) 40: if (i != nIn) 41: txTmp.vin.nSequence = 0; 42: } 43: // Blank out other inputs completely, not recommended for open transactions 44: if (nHashType & SIGHASH_ANYONECANPAY) 45: { 46: txTmp.vin[0] = txTmp.vin[nIn]; 47: txTmp.vin.resize(1); 48: } 49: // Serialize and hash 50: CDataStream ss(SER_GETHASH); 51: ss.reserve(10000); 52: ss << txTmp << nHashType; 53: return Hash(ss.begin(), ss.end()); 54: } in 0.10: uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType) { if (nIn >= txTo.vin.size()) { // nIn out of range return 1; } // Check for invalid use of SIGHASH_SINGLE if ((nHashType & 0x1f) == SIGHASH_SINGLE) { if (nIn >= txTo.vout.size()) { // nOut out of range return 1; } } // Wrapper to serialize only the necessary parts of the transaction being signed CTransactionSignatureSerializer txTmp(txTo, scriptCode, nIn, nHashType); // Serialize and hash CHashWriter ss(SER_GETHASH, 0); ss << txTmp << nHashType; return ss.GetHash(); } so the diffirent version mean the Signature is different Signature even though the everything is same? that ' s amazy! Title: Re: different version have different SignatureHash? Post by: achow101 on July 30, 2018, 07:33:08 AM No, it is not. You are completely misunderstanding the logic. The signature hash is exactly the same, it just uses different logic to construct it. CTransactionSignatureSerializer does not just stick the arguments to it together, it actually has logic to place things in the correct places. If you actually followed the code for it, you would see that it has it is an object that has its own serialize method which makes use of the arguments passed to it. It is the same signature hash, but with the logic abstracted out to a different object.
Title: Re: different version have different SignatureHash? Post by: zhengjianxun on July 30, 2018, 09:46:00 AM ho my god ,you are the real bitcoin expert . i am reading the bitcoin source code .it is difficult but exciting for me. database、network there are so many thing i should to understanding. thank you . i hope i can strong like you :-*
|