1. 程式人生 > >比特幣原始碼解讀之交易發起

比特幣原始碼解讀之交易發起

(本文使用的是比特幣v0.1.0版本 點選下載原始碼)

本文主要描述交易是如何發起中,其過程包含交易的新建(包含交易的選擇,交易費的計算、簽名);提交交易請求;本節點接受交易(驗證、檢查並儲存交易等);最後廣播交易到其他節點中。
流程圖如下所示:

新建交易

  1. if(!CreateTransaction(scriptPubKey, nValue, wtxNew, nFeeRequired))
  2. {
  3. string strError;
  4. if(nValue + nFeeRequired >GetBalance())
  5. strError = strprintf("Error: This is an oversized transaction that requires a transaction fee of %s "
    ,FormatMoney(nFeeRequired).c_str());
  6. else
  7. strError ="Error: Transaction creation failed ";
  8. wxMessageBox(strError,"Sending...");
  9. return error("SendMoney() : %s\n", strError.c_str());
  10. }

選取交易

具體選擇交易使用的“隨機逼近演算法”在後續《比特幣原始碼解讀之選幣》一文中介紹

  1. set<CWalletTx*> setCoins;
  2. if(!SelectCoins(nValue, setCoins))
  3. return
    false;

計算交易費

如果預設的交易費小於當前計算的交易費用,則需要根據當前計算的交易費重新填充交易

  1. // Check that enough fee is included
  2. if(nFee < wtxNew.GetMinFee(true))
  3. {
  4. nFee = nFeeRequiredRet = wtxNew.GetMinFee(true);
  5. continue;
  6. }

填充輸入和輸出

填充輸出

  1. wtxNew.vout.push_back(CTxOut(nValueOut, scriptPubKey));
  2. // Fill vout[1] back to self with any change
  3. if(nValueIn
    > nValue)
  4. {
  5. // Use the same key as one of the coins
  6. vector<unsignedchar> vchPubKey;
  7. CTransaction& txFirst =*(*setCoins.begin());
  8. foreach(constCTxOut& txout, txFirst.vout)
  9. if(txout.IsMine())
  10. if(ExtractPubKey(txout.scriptPubKey,true, vchPubKey))
  11. break;
  12. if(vchPubKey.empty())
  13. returnfalse;
  14. // Fill vout[1] to ourself
  15. CScript scriptPubKey;
  16. scriptPubKey << vchPubKey << OP_CHECKSIG;
  17. wtxNew.vout.push_back(CTxOut(nValueIn - nValue, scriptPubKey));
  18. }

填充輸入

  1. foreach(CWalletTx* pcoin, setCoins)
  2. for(int nOut =0; nOut < pcoin->vout.size(); nOut++)
  3. if(pcoin->vout[nOut].IsMine())
  4. wtxNew.vin.push_back(CTxIn(pcoin->GetHash(), nOut));
  5. 簽名
  6. int nIn =0;
  7. foreach(CWalletTx* pcoin, setCoins)
  8. for(int nOut =0; nOut < pcoin->vout.size(); nOut++)
  9. if(pcoin->vout[nOut].IsMine())
  10. SignSignature(*pcoin, wtxNew, nIn++);

計算Merkle值

  1. wtxNew.AddSupportingTransactions(txdb);
  2. voidCWalletTx::AddSupportingTransactions(CTxDB& txdb)
  3. {
  4. vtxPrev.clear();
  5. constint COPY_DEPTH =3;
  6. if(SetMerkleBranch()< COPY_DEPTH)
  7. {
  8. vector<uint256> vWorkQueue;
  9. foreach(constCTxIn& txin, vin)
  10. vWorkQueue.push_back(txin.prevout.hash);
  11. // This critsect is OK because txdb is already open
  12. CRITICAL_BLOCK(cs_mapWallet)
  13. {
  14. map<uint256,constCMerkleTx*> mapWalletPrev;
  15. set<uint256> setAlreadyDone;
  16. for(int i =0; i < vWorkQueue.size(); i++)
  17. {
  18. uint256 hash = vWorkQueue[i];
  19. if(setAlreadyDone.count(hash))
  20. continue;
  21. setAlreadyDone.insert(hash);
  22. CMerkleTx tx;
  23. if(mapWallet.count(hash))
  24. {
  25. tx = mapWallet[hash];
  26. foreach(constCMerkleTx& txWalletPrev, mapWallet[hash].vtxPrev)
  27. mapWalletPrev[txWalletPrev.GetHash()]=&txWalletPrev;
  28. }
  29. elseif(mapWalletPrev.count(hash))
  30. {
  31. tx =*mapWalletPrev[hash];
  32. }
  33. elseif(!fClient && txdb.ReadDiskTx(hash, tx))
  34. {
  35. ;
  36. }
  37. else
  38. {
  39. printf("ERROR: AddSupportingTransactions() : unsupported transaction\n");
  40. continue;
  41. }
  42. int nDepth = tx.SetMerkleBranch();
  43. vtxPrev.push_back(tx);
  44. if(nDepth < COPY_DEPTH)
  45. foreach(constCTxIn& txin

    相關推薦

    原始碼解讀交易發起

    (本文使用的是比特幣v0.1.0版本 點選下載原始碼)本文主要描述交易是如何發起中,其過程包含交易的新建(包含交易的選擇,交易費的計算、簽名);提交交易請求;本節點接受交易(驗證、檢查並儲存交易等);最後廣播交易到其他節點中。流程圖如下所示:新建交易if(!CreateTra

    原始碼解讀整體框架

          本文主要描述了程序啟動時初始化(載入地址、區塊、錢包資訊,啟動節點執行緒以及礦工挖礦執行緒等)、比特幣客戶端交易的發起(交易初始化、提交交易請求、確認和廣播及交易)以及比特幣客戶端當前節點地址和收款方地址。下文將根據總體框架圖分別描述各個功能在原始碼中的函式實現(

    原始碼解讀執行緒處理-礦工執行緒

    (本文使用的是比特幣v0.1.0版本 點選下載原始碼)   比特幣原始碼解讀之執行緒處理分為兩篇,礦工執行緒處理和其他執行緒處理兩篇,本文描述礦工執行緒處理,主要包含創幣交易的產生、當前交易的打包處理,工作量等相關內容。流程圖如下所示: 新建礦

    原始碼解讀私鑰、公鑰和地址

    (本文使用的是比特幣v0.1.0版本 點選下載原始碼)比特幣是建立在數字加密基礎上的,接觸過比特幣的朋友應該知道:(1)購買比特幣最後是通過一個比特幣地址進行的,比特幣地址就像支票中的支付物件(收款方);(2)而比特幣地址則是通過公鑰單向雜湊生成的;(3)而公鑰則是通過私鑰使

    原始碼解讀區塊確認

    (本文使用的是比特幣v0.1.0版本 點選下載原始碼)本文主要描述礦工挖到區塊或者收到“block”訊息後進行的區塊處理。主要包含區塊有效性檢查,孤立區塊處理以及當前區塊處理等(ps:本文暫不涉及工作量證明以及共識, 這兩方面內容再後續文章中介紹)流程圖如下所示:本文主要描述

    原始碼解讀前期準備

    前言       筆者從今天開始對bitcoin 第一個發行版v0.1.0版本進行原始碼分析(ps. 網上對比特幣高版本的分析文章很多,但是介紹第一個版本的分析很少,系統全面的分析第一個版本更是寥寥無幾)。讀者如果需要了解學習區塊鏈技術,可能從第一個版本中受到啟發。這是一系列

    原始碼解讀

    這篇我們主要分析下AppInit2的程式碼,這個函式在init.cpp中。這個函式分了12步完成了初始化客戶端的功能。裡面包含了bitcoin的大部分初始程式,包括讀取'塊索引'、載入塊鏈、載入100個預產生的keys,匯入peers.dat中的資訊,以及初始化其他執行緒。現在我們就看下這12步都做了些什麼。

    原始碼閱讀(1)--雜記與加密部分(爽小刀)

    比特幣原始碼閱讀(1)–雜記與加密部分(爽之小刀) 歡迎轉載和引用 若有問題請聯絡請聯絡 Email : [email protected] QQ:2279557541 最近從成都來到了杭州拼一槍 由於老婆為了圓自己的一個大公司夢來到了杭州

    原始碼分析--深入理解交易

    交易是比特幣最重要的一塊,比特幣系統的其他部分都是為交易服務的。前面的章節中已經學習了各種共識演算法以及比特幣PoW共識的實現,本文來分析比特幣中的交易相關的原始碼。 1 初識比特幣交易     通過比特幣核心客戶端的命令getrawtransaction和decoder

    原始碼研讀(二)搭環境遇到的那些坑

    首先說一下度《精通比特幣》是一直不理解的一個地方: 上面兩處被圈起來的地方都提到了一個數字2256,特別是第一句話更是讓人費解,如果私鑰只能在1到2256間產生那豈不是太容易重複了。關於這點,我認為是在翻譯或者排版是出現了錯誤,2256應該是想表達2的256次方的意

    原始碼研讀--交易細節

    0x00 讀碼即挖礦 前兩天看到群裡還有人在討論ETH和EOS的DAPP開發,看來區塊鏈的落地還是一線希望,大家可以繼續給自己的信仰充值。充值方式眾多,比如加倉,Fomo,或是寫DAPP,讀程式碼。那我繼續前兩次的操作,繼續閱讀BTC的程式碼,版本0.8.2。上次粗讀了一番

    原始碼情景分析script指令碼驗證(1)

    Bitcoin script是一種簡單的指令執行框架1)指令碼概述指令碼主要由兩部分構成:指令碼物件CScript和執行函式VerifyScript。指令碼物件分為兩類:scriptSig和scriptPublicKeyscriptSig位於交易中的txin中,而script

    原始碼情景分析bloom filter精讀

    上一篇SPV錢包裡utxos同步提到了bloom filter,這一章節我們將從原始碼分析角度來個深度解剖Bloom filter基本原理 An example of a Bloom filter, representing the set {x, y, z}. The co

    原始碼情景分析script指令碼驗證(2)

        通過上一篇的分析,我們應該已經對script有了一定的理解,這章節我們以原始碼分析的方式來了解下指令碼驗證執行流程    bitcoin節點在處理一條交易時就需要驗證交易的txin,由於一條交易可能包含多個txin,因而需要執行多個指令碼驗證,自然需要並行化,因而系統

    原始碼情景分析SPV錢包輕量級錢包

    SPV錢包最理想的實現方案是,伺服器是全節點,SPV錢包通過伺服器驗證和發起交易,查詢交易歷史,本地做交易封裝,即signRawTransaction和使用者互動。SPV節點不需要執行bitcoin core程式碼,由於需要監聽先的交易事件,需要伺服器通過JPush類似的機制主動通知SPV錢包新的交易等事件。

    區塊鏈系列教程:的錢包與交易

    [toc] # 簡介 錢包在比特幣中是做什麼的呢?比特幣的交易又有什麼特點呢?怎麼才能偽造比特幣的交易呢?今天和大家一起學習一下比特幣中的錢包和交易。 # 比特幣密碼學的基礎 之前我們提到過比特幣使用的並不是什麼新技術,只是對於老的技術比如:P2P網路,分散式系統,密碼學,共識演算法的重新而又巧妙的應

    腳本及交易分析 - 智能合約雛形

    比特幣大家都有轉過賬,每筆交易是這樣的:張三賬上減¥200,李四賬上加¥200。在比特幣區塊鏈中,交易不是這麽簡單,交易實際是通過腳本來完成,以承載更多的功能個,這也是為什麽比特幣被稱為是一種“可編程的貨幣”。本文就來分析一下交易是如何實現可編程的。 未花費的交易輸出(UTXO) 先引入一個概念:未花費的

    升級版位元聯儲(UBTC)十大優勢解析

    原作者:幣世通 略有修改   比特幣(BitCoin)的概念最初由中本聰在2009年提出,根據中本聰的思路設計釋出的開源軟體以及建構其上的P2P網路。比特幣是一種P2P形式的數字貨幣,點對點的傳輸意味著一個去中心化的支付系統。   與大多數貨幣不同,比特幣不依

    的機制1:記賬的方式,交易的語法,指令碼,P2PKH交易

    原文連結:郭老師的備課資料 比特幣的共識機制生成了一個append-only的賬本,一旦交易在賬本中,再也不能更改。礦工——也即一些有較高計算力的節點,生成區塊,並且驗證交易是正確的(簽名是正確的、幣沒有重複花費)等。賬本和區塊鏈網路使得比特幣成為一種貨幣。在本文中,將介紹一些細節。

    區塊鏈學習1.5-原始碼的學習-網路

    本篇文章有部分內容直接出自《Mastering Bitcoin》 比特幣網路層主要是由 P2P網路,傳播機制,驗證機制三部分組成。 白皮書關於network的內容回顧一下: The steps to run the network are as follows: