比特幣礦工什麼時候停止打包交易?是否會出現交易不一致或者交易遺漏

每10分鐘打包一次到底是什麼意思呀,是從上一個區塊產生之後立即開始打包嗎?

打包的計算過程中如果又有交易產生應該如何處理呢?

每個礦工接收到的交易可能不一致啊,如果兩個礦工都計算出結果,但是交易不一樣該怎麼辦呢?

會不會有些礦工選擇特定交易加入區塊,而忽略某些交易呢?


謝邀。

幾個問題其實都是圍繞著新block的誕生機制:

先簡單介紹一個新block生成步驟:

  1. 節點監聽全網交易,通過驗證的交易進入節點的內存池(Tx Mem
    Pool),並更新交易數據的Merkle Hash值
  2. 更新時間戳
  3. 嘗試不同的隨機數(Nonce),進行hash計算
  4. 重複該過程至找到合理的hash
  5. 打包block:先裝入block
    meta信息,然後是交易數據
  6. 對外部廣播出新block
  7. 其他節點驗證通過後,鏈接至Block Chain,主鏈高度加一,然後切換至新block後面挖礦

手續費和挖礦獎勵驅使大量礦工加入驗證,類似於大家一起加入個拋骰子遊戲,第一個拋出固定規則骰子的人獲得獎勵。由於hashPrevBlock()欄位的存在,使得大家總是在最新的block後面開挖,下一個被承認的區塊裡面必須包含上一個區塊hash,這確保了交易驗證打包是有順序的。

從block hash演算法我們知道,合理的block並不是唯一的(正確的答案不止一個!),同一高度存在多個block的可能性。也就是說就算你算出來了也可能拿不到獎勵。那麼,當同一個高度出現多個block時,主鏈即出現分叉(Fork)。遇到分叉時,網路會根據下列原則選舉出Best Chain

  1. 不同高度的分支,總是接受最高(即最長)的那條分支
  2. 相同高度的,接受難度最大的
  3. 高度相同且難度一致的,接受時間最早的
  4. 若所有均相同,則按照從網路接受的順序
  5. 等待Block Chain高度增一,則重新選擇Best Chain

基於理性選擇(為了能賺取挖礦獎勵的比特幣),在上一個上驗證完成後所有礦工會迅速加入下一輪。其次即使寫入區塊,交易還是有被撤銷風險,為了防止交易被證偽、被撤銷,一般需要 6 個 blocks 或者 1 小時,就可以使得撤銷交易所需要的運算量達到完全不切實際的程度。所有的區塊就是通過這種方式鏈在了一起。

下面來回答你的問題:

10 分鐘是系統找到一個有效的交易鏈塊所需要的平均時間,基於運氣這個時間實際上會稍長或稍短。準確說10分鐘是 Satoshi 對新
block 在大型網路中傳遞所需的時間和由於交易鏈分拆而被浪費的工作量之間的折衷選擇。在挖礦激勵下不斷驗證發生的交易產生新區塊,新發生的交易來不及驗證的加入排隊等待,支付更多手續費的交易可以提高被驗證的優先順序。

如果看完上面的區塊產生機制就會明白打包交易不一致和礦工選擇性驗證是不可能的,因為規則是固定的,你不按照這個規則挖礦產生的將會是一條不被認可的分叉,不可能獲得獎勵就沒人會去選擇,畢竟挖礦成本很高大家都是沖著錢去的。

希望對你理解有所幫助。


額,謝邀,我做個科普級別的回答,歡迎討論。首先打開一個區塊瀏覽器,我們邊看邊說。(這裡打開的是http://btc.com區塊瀏覽器)

1,關於打包時間

從區塊鏈狀態上看,可以看到「442349 挖坑中」和其左邊已經挖出的塊,442349是塊的高度,還可以看到塊的一些相關訊息,如廣播方,大小,時間。

我們可以發現他們之間間隔並不是精確的10分鐘打包一次。

大家常說的10分鐘打包一次,其實是一個平均水平的間隔時間。雖然每次間隔不一,但是通過一些規則設置可以控制這個時間大概保持在10分鐘左右,如難度調整,增加或減少(這裡如果還有疑問可以留言,我詳細說)。

2,關於未打包的數據

我們可以看到「未確認交易」里的數量6053和總大小9.31MB,這裡的數據我們可以想像成他們是處於一個「待打包數據池」里,實際上,一直都有排著隊等著打包的數據,當然,如果沒有了等待打包的數據,停止打包新數據,那麼區塊鏈也就沒有了未來,對未來沒有影響的歷史我認為可以等於不存在的歷史。

最近24小時里平均每秒確認3.08個交易,這個確認速度與未確認的6053個交易相比,交易擁堵現象確實很嚴重。如果你使用bitcoin-qt錢包自定義交易手續費,你可能會在你發出交易時發現,它提示你設置一定數量手續費,以免你的交易永遠無法確認。你的交易因為手續費低而一直被放在「待打包數據池」里,這個可能性確實是有的。為了解決擁堵這個問題,有不少方案,如修改代碼,對打包大小進行擴容,將1MB改為更大,可那就可能引起分叉的風險,所以一直沒有太大進展。(關於那些方案,其內容和故事比較多,就先坑下了)

3,關於分叉

確實會產生相同高度但不同的塊,隨之可能產生不同的分支,區塊鏈可能會擁有不同的歷史走向。俗話就叫分叉,分叉會引起像以太坊那樣的社群分裂或者更嚴重的情況。但是我個人傾向辯證的看待這個問題,我把分叉看成是生物的基因突變、進化和淘汰,我認為看不到終點的生命,它就沒有擁有起點的意義。

事實上,經常會產生相同高度的不同塊,通常都會很及時的放棄弱勢的那一個,但是較嚴重的情況也會發生,我是說連續分叉好幾個高度。但是目前來看,分叉沒有引起非常大的壞影響。(關於分叉,可能得牽涉到大算力們礦池們,討論的可能很多,也先坑下來)


不一致就分叉啊 6塊才確認呢 10分鐘出兩個不一樣的塊 扔掉一個就行了唄。。。


看了大家的描述,我受益匪淺,在此還是有幾個問題沒有弄明白

1,每個礦工是否可以自行選擇要確認的交易,如果可以,那就可能在同一時間產生交易記錄不一樣的區塊,分別被廣播

2,礦工是否可以用小於1M的交易去hash計算,如果產生區塊,這樣交易紀錄小於1M的區塊是否會被認可


1.關於10分鐘打包

代碼中並沒有固定參數規定要10分鐘打包,而是用一個規則使得:「力圖逼近10分鐘為期望出塊時間」。

首先,必然是誰越先拿出結果誰就得到獎勵,那麼是不是礦工最希望的就是拿到第一個的交易,就馬上計算hash,力圖最先把大獎拿到?其實就是這樣的!立馬就算,可是,你會發現,按照全網算力的平均水平,大家每次中獎的期望時間,自然正好就是10分鐘左右。

為什麼會自然正好是10分鐘?那就牽涉到難度係數的這個設計,難度係數越大,計算時間就越長,越小就越短,而這個難度係數並非寫死的,而是根據統計2周內的總塊量而定的,使得如果超過了上限,就會增加難度,那麼就是要求hash結果要多一些0,如果全網算力下降,那麼就可以少要求一些0。2周一次調整的動態平衡決定。

參考代碼:

//目標時間窗口長度:兩周
static const int64 nTargetTimespan = 14 * 24 * 60 * 60;
// block頻率,每10分鐘一塊
static const int64 nTargetSpacing = 10 * 60;
// 每兩周的產量2016,也是調節周期
static const int64 nInterval = nTargetTimespan / nTargetSpacing;

2.關於打包過程中又有交易

好像以上幾位都沒有回答這個問題,只回答了區塊鏈整個塊已經挖出後的處理過程,不是挖出之前。

我也一直疑惑過這個問題,並沒有在代碼中看到明確的定義,感覺是自然的結果。

按照我的猜想,程序運行起來,是收到多少有效的交易,就加入多少,直到撐到1M大小極限(後續超量部分就先放緩衝隊列)。

這個新塊,也就是臨時賬本,初始狀態先是空的,從收到一個有效交易起,就開始計算hash,而一旦有新的交易被收到,那就立即加入這臨時賬本的尾部,並按新的、更大的這個臨時賬本繼續計算hash,因為本身就是碰運氣找出幸運數字,那麼之前的無效勞動已經付出了,那也就是白付出了,和後面是否用新賬本去計算hash沒有任何關係,1條交易的臨時賬本和500條交易的臨時賬本,中獎需要的計算次數期望值是一樣的。

3.關於最終生成的有效塊不同

搜索以下關鍵詞:

區塊鏈分叉
區塊鏈51%攻擊

4.關於是否選擇特定交易而忽略某些交易

確實是這樣的。

首先,礦工挖礦所得,不僅僅是得到預定產生的挖礦獎勵,還包括該塊中所有交易附上的手續費,那麼答案就非常明顯了。計算過程中當然是希望包含的手續費越多越好,那麼當然是首先把手續費越高的越先放進去,以此為主要順序,最終填滿直到1M極限。那麼在當前比特幣交易嚴重擁塞的情況下,一個交易如果填寫了太小的手續費,恐怕是一輩子也別想成交了,如同喊著1塊錢誰賣我蘋果的股票一樣。

如有錯誤,希望指正。


推薦閱讀:

一個產品聲稱運用了區塊鏈技術,普通人如何進行驗證?
比特幣主要交易平台2017年1月24日起將雙向收取0.2%交易手續費你怎麼看?
現在如何把幾千個比特幣變現而且證明財產合法?
如何評價,"比特幣不可能做大,因為一做大就會被國家以暴力控制"的言論 ?
為什麼USDT被盜會導致比特股(BTS)大幅上漲?

TAG:比特幣Bitcoin | 萊特幣Litecoin | 比特幣礦池 | 區塊鏈Blockchain | 比特幣Bitcoin交易平台 |