比特幣原始碼解讀之交易發起
(本文使用的是比特幣v0.1.0版本 點選下載原始碼)
本文主要描述交易是如何發起中,其過程包含交易的新建(包含交易的選擇,交易費的計算、簽名);提交交易請求;本節點接受交易(驗證、檢查並儲存交易等);最後廣播交易到其他節點中。
流程圖如下所示:
新建交易
if(!CreateTransaction(scriptPubKey, nValue, wtxNew, nFeeRequired))
{
string strError;
if(nValue + nFeeRequired >GetBalance())
strError = strprintf("Error: This is an oversized transaction that requires a transaction fee of %s "
else
strError ="Error: Transaction creation failed ";
wxMessageBox(strError,"Sending...");
return error("SendMoney() : %s\n", strError.c_str());
}
選取交易
具體選擇交易使用的“隨機逼近演算法”在後續《比特幣原始碼解讀之選幣》一文中介紹
set<CWalletTx*> setCoins;
if(!SelectCoins(nValue, setCoins))
return
計算交易費
如果預設的交易費小於當前計算的交易費用,則需要根據當前計算的交易費重新填充交易
// Check that enough fee is included
if(nFee < wtxNew.GetMinFee(true))
{
nFee = nFeeRequiredRet = wtxNew.GetMinFee(true);
continue;
}
填充輸入和輸出
填充輸出
wtxNew.vout.push_back(CTxOut(nValueOut, scriptPubKey));
// Fill vout[1] back to self with any change
if(nValueIn
{
// Use the same key as one of the coins
vector<unsignedchar> vchPubKey;
CTransaction& txFirst =*(*setCoins.begin());
foreach(constCTxOut& txout, txFirst.vout)
if(txout.IsMine())
if(ExtractPubKey(txout.scriptPubKey,true, vchPubKey))
break;
if(vchPubKey.empty())
returnfalse;
// Fill vout[1] to ourself
CScript scriptPubKey;
scriptPubKey << vchPubKey << OP_CHECKSIG;
wtxNew.vout.push_back(CTxOut(nValueIn - nValue, scriptPubKey));
}
填充輸入
foreach(CWalletTx* pcoin, setCoins)
for(int nOut =0; nOut < pcoin->vout.size(); nOut++)
if(pcoin->vout[nOut].IsMine())
wtxNew.vin.push_back(CTxIn(pcoin->GetHash(), nOut));
簽名
int nIn =0;
foreach(CWalletTx* pcoin, setCoins)
for(int nOut =0; nOut < pcoin->vout.size(); nOut++)
if(pcoin->vout[nOut].IsMine())
SignSignature(*pcoin, wtxNew, nIn++);
計算Merkle值
wtxNew.AddSupportingTransactions(txdb);
voidCWalletTx::AddSupportingTransactions(CTxDB& txdb)
{
vtxPrev.clear();
constint COPY_DEPTH =3;
if(SetMerkleBranch()< COPY_DEPTH)
{
vector<uint256> vWorkQueue;
foreach(constCTxIn& txin, vin)
vWorkQueue.push_back(txin.prevout.hash);
// This critsect is OK because txdb is already open
CRITICAL_BLOCK(cs_mapWallet)
{
map<uint256,constCMerkleTx*> mapWalletPrev;
set<uint256> setAlreadyDone;
for(int i =0; i < vWorkQueue.size(); i++)
{
uint256 hash = vWorkQueue[i];
if(setAlreadyDone.count(hash))
continue;
setAlreadyDone.insert(hash);
CMerkleTx tx;
if(mapWallet.count(hash))
{
tx = mapWallet[hash];
foreach(constCMerkleTx& txWalletPrev, mapWallet[hash].vtxPrev)
mapWalletPrev[txWalletPrev.GetHash()]=&txWalletPrev;
}
elseif(mapWalletPrev.count(hash))
{
tx =*mapWalletPrev[hash];
}
elseif(!fClient && txdb.ReadDiskTx(hash, tx))
{
;
}
else
{
printf("ERROR: AddSupportingTransactions() : unsupported transaction\n");
continue;
}
int nDepth = tx.SetMerkleBranch();
vtxPrev.push_back(tx);
if(nDepth < COPY_DEPTH)
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: