字簽名與交易確認(rèn))
上一期我們把區(qū)塊鏈的底層數(shù)據(jù)結(jié)構(gòu)過了一遍這次接著聊交易。很多剛?cè)腴T的同學(xué)會有個錯覺在交易平臺里點(diǎn)一下“轉(zhuǎn)出”和用錢包地址直接給別人轉(zhuǎn)幣是一回事。其實(shí)完全不是。前者是在平臺內(nèi)部賬本上劃一筆平臺說轉(zhuǎn)出就轉(zhuǎn)出了甚至可能只是一條數(shù)據(jù)庫記錄的變更后者才是真正意義上的P2P交易——你的私鑰對一條轉(zhuǎn)賬指令簽名然后把它廣播給全網(wǎng)節(jié)點(diǎn)由全網(wǎng)共同驗(yàn)證、記賬、確認(rèn)。這個過程中沒有銀行沒有平臺客服也沒有可以打電話申訴的中間人。搞清楚P2P交易原理是理解區(qū)塊鏈開發(fā)、錢包實(shí)現(xiàn)、節(jié)點(diǎn)同步乃至智能合約繞不開的一步。這篇教程我不打算只講概念而是直接從一筆交易從發(fā)起到上鏈的完整鏈路拆開講把每個環(huán)節(jié)為什么要這么設(shè)計(jì)、實(shí)際開發(fā)中容易踩什么坑一并說清楚。1. 一筆P2P交易的全鏈路概覽1.1 交易的本質(zhì)不是“轉(zhuǎn)賬”而是“廣播一條指令”很多人第一次接觸區(qū)塊鏈交易時腦子里還帶著傳統(tǒng)轉(zhuǎn)賬的模型我賬戶里有10塊錢我轉(zhuǎn)6塊給你系統(tǒng)從我賬戶扣6塊加到你賬戶上。但在真正的P2P交易里根本沒有“賬戶余額”這個東西。網(wǎng)絡(luò)里只存在一條條交易記錄以及每筆交易產(chǎn)生的“未花費(fèi)輸出”。你發(fā)起轉(zhuǎn)賬時做的事情本質(zhì)上只是構(gòu)造了一條指令我擁有某個地址上的若干幣現(xiàn)在授權(quán)把這些幣轉(zhuǎn)移給另一個地址同時找零回到我自己控制的地址。這條指令用你的私鑰簽名后廣播到全網(wǎng)。節(jié)點(diǎn)收到后校驗(yàn)簽名是否有效、被花的幣是否真實(shí)存在、是否已經(jīng)被花過。確認(rèn)沒問題就把它放進(jìn)自己的交易池等礦工打包進(jìn)下一個區(qū)塊。打包成功后這筆交易才算正式生效。所以P2P交易嚴(yán)格來說不是“劃賬”而是“全網(wǎng)共識下的一筆狀態(tài)變更”。這個區(qū)別聽起來簡單但影響深遠(yuǎn)。平臺轉(zhuǎn)賬是中心化賬本里改數(shù)字效率和體驗(yàn)雖然好但信任完全押在平臺上——平臺可以凍結(jié)、可以后臺篡改、可以拒絕讓你提幣。P2P交易則是把信任交給了密碼學(xué)和全網(wǎng)節(jié)點(diǎn)只要你的私鑰不泄露沒有任何單一機(jī)構(gòu)可以攔住這筆交易。1.2 從構(gòu)造到上鏈的六個關(guān)鍵環(huán)節(jié)一筆交易從你手中發(fā)起到最終確認(rèn)我把它拆成六個環(huán)節(jié)構(gòu)造交易錢包掃描你地址下所有可花的UTXO選出足夠金額指定收款人和找零地址。簽名用私鑰對交易摘要做數(shù)字簽名證明你確實(shí)擁有這批幣的所有權(quán)。廣播把完整交易數(shù)據(jù)發(fā)送給相鄰節(jié)點(diǎn)節(jié)點(diǎn)再轉(zhuǎn)發(fā)給其他節(jié)點(diǎn)逐步擴(kuò)散到全網(wǎng)。驗(yàn)證每個節(jié)點(diǎn)獨(dú)立校驗(yàn)交易格式、簽名、UTXO狀態(tài)、輸入輸出金額關(guān)系。打包礦工從交易池中優(yōu)先選高費(fèi)率交易放進(jìn)自己正在構(gòu)造的區(qū)塊。確認(rèn)區(qū)塊被其他節(jié)點(diǎn)接受并繼續(xù)在其上挖礦交易獲得一個又一個確認(rèn)數(shù)。后文我會對這幾個環(huán)節(jié)分別展開。但我想先把最基礎(chǔ)、也最容易被忽略的密碼學(xué)部分講透因?yàn)楹芏嗳藭憽鞍l(fā)送交易”的代碼卻說不清楚簽名到底在保護(hù)什么。2. 密鑰、地址與簽名為什么只有你能花這筆錢2.1 從私鑰到地址的推導(dǎo)過程先明確一點(diǎn)地址不是“銀行卡號”私鑰也不是“密碼”。它們?nèi)咧g存在嚴(yán)格的推導(dǎo)關(guān)系。在主流采用橢圓曲線簽名的鏈上這個鏈路大致是私鑰一個256位隨機(jī)數(shù)是整個賬號體系的根。公鑰由私鑰通過橢圓曲線乘法計(jì)算得到別人可以從地址反推公鑰但無法從公鑰反推私鑰。地址通常是對公鑰做兩次哈希SHA-256后再RIPEMD-160再添加版本號和校驗(yàn)碼編碼得到的字符串。所以公鑰可以公開地址是公鑰的哈希相當(dāng)于公鑰的“短名片”。私鑰則必須絕對保密因?yàn)檎l持有私鑰誰就能對該地址名下的UTXO完成簽名并轉(zhuǎn)走資產(chǎn)。實(shí)操里很多人不理解“為什么我的錢包可以收到幣但沒有任何余額記錄”。答案是鏈上根本沒有余額表只有一條條交易輸出。你的地址“余額”全鏈節(jié)點(diǎn)是靠掃描所有交易里未花費(fèi)的輸出來匯總的。錢包做的事情本質(zhì)上也是掃鏈不是查數(shù)據(jù)庫。2.2 數(shù)字簽名兩把鑰匙一套鎖我習(xí)慣用“印章”來類比簽名機(jī)制。傳統(tǒng)合同簽字別人可以模仿筆跡區(qū)塊鏈簽名用的是非對稱密碼學(xué)簽名者有一把私鑰驗(yàn)證者用對應(yīng)的公鑰去驗(yàn)。一筆交易的簽名至少承擔(dān)兩件事第一證明所有權(quán)。交易里引用了某個UTXOUTXO里寫明這筆錢鎖定在某個公鑰哈希上。你要花它就必須提供一個能從該公鑰哈希驗(yàn)簽通過的數(shù)字簽名。沒有私鑰就構(gòu)造不出合法簽名。第二防篡改。簽名是對整個交易內(nèi)容輸入、輸出、金額、找零賬戶等的哈希做的。交易數(shù)據(jù)任何一個字節(jié)被改動——比如轉(zhuǎn)賬金額從6改成600——簽名驗(yàn)證立刻失敗。這個設(shè)計(jì)非常關(guān)鍵。傳統(tǒng)金融里轉(zhuǎn)賬出錯可以調(diào)賬、可以申訴區(qū)塊鏈上沒有“撤銷交易”按鈕只能靠簽名保證交易內(nèi)容在廣播過程中不被任何人動手腳。2.3 這里最容易栽的坑我見過不少初學(xué)者在測試網(wǎng)上跑交易出現(xiàn)兩類問題。一類是把主網(wǎng)地址和測試網(wǎng)地址混用。某地址格式相同但測試網(wǎng)和主網(wǎng)的地址版本號不同混用后交易要么無法被識別要么幣被發(fā)到一個無法找回的地方。這個沒有任何“客服”可以幫你只能自認(rèn)損失。另一類是隱私意識問題。有些人喜歡把一個大UTXO分成多個小額輸出制造大量找零地址。這不違法但所有UTXO關(guān)系在鏈上一目了然只要別人知道其中一個地址屬于你順著輸入輸出就能把你名下所有地址串起來。P2P交易不是匿名的它只是假名化。想真正保護(hù)隱私必須理解UTXO的關(guān)聯(lián)性設(shè)計(jì)而不能只抄一段代碼了事。另外一個非?;A(chǔ)的坑私鑰備份只會做一次的人很多。錢包生成了助記詞但長期不用后忘了托管位置等需要恢復(fù)時才發(fā)現(xiàn)備份丟了。P2P世界里“丟私鑰丟資產(chǎn)”這不是夸張而是無數(shù)真實(shí)事故換來的結(jié)論。3. 沒有“余額表”的賬本UTXO模型到底怎么記賬3.1 UTXO的直觀理解找回零錢UTXO的全稱是Unspent Transaction Output中文叫“未花費(fèi)交易輸出”。這個詞對剛接觸的人很不友好我每次講都用“現(xiàn)金找零”類比。想象你只有一張100元鈔票要買65元的東西。你不會把100元拆成65和35兩半而是把100元整張交給收銀員收銀員找回你一張35元。在這筆交易里原本那張100元鈔票的“生命周期”就結(jié)束了它變成兩個新實(shí)體一張65元的商品對應(yīng)物一張35元的找零退給你。區(qū)塊鏈的UTXO模型完全一樣。你有一個UTXO面額是10個幣你要轉(zhuǎn)給B 6個幣。節(jié)點(diǎn)不會把10拆成64而是把原來10個幣的UTXO標(biāo)記為已花費(fèi)然后新生成兩筆UTXO一筆6個幣鎖定到B的地址一筆4個幣鎖定到你自己的找零地址。找零地址通常是你控制的另一個地址甚至可能是全新地址。每一筆交易輸入UTXO被全部銷毀輸出UTXO全部新建。這就是為什么UTXO模型下每一枚幣都有清晰的“出身鏈”可追溯性天然存在。3.2 和賬戶余額模型的本質(zhì)區(qū)別以太坊這類的賬戶模型更接近傳統(tǒng)銀行每個地址一個余額數(shù)字轉(zhuǎn)賬就是A余額減、B余額加。作為一個處理過UTXO模型的錢包開發(fā)者我可以負(fù)責(zé)任地說這兩種模型的取舍非常明顯。我整理過一個對比表方便你快速理解維度UTXO模型賬戶余額模型記賬單位交易輸出每個都是獨(dú)立對象地址下的一個整數(shù)余額轉(zhuǎn)賬操作銷毀若干舊UTXO創(chuàng)建新UTXO余額加減并發(fā)處理同一地址的多個UTXO可并行花同一賬戶并發(fā)容易沖突可追溯性天然支持可追蹤每枚幣來源較弱需另行記錄歷史隱私表現(xiàn)相對更好可換找零地址余額實(shí)時可見關(guān)聯(lián)性強(qiáng)實(shí)現(xiàn)復(fù)雜度錢包需要UTXO掃描、找零管理實(shí)現(xiàn)更直接UTXO模型對開發(fā)者的第一課是你不能直接說“從地址A轉(zhuǎn)6個幣到地址B”你得先找A名下有哪些面額夠大的UTXO還要預(yù)留手續(xù)費(fèi)。有時候?yàn)榱藴悏蜻@6個幣你可能要合并三五個小額UTXO交易體積變大手續(xù)費(fèi)也跟著漲。3.3 動手拆解一筆交易的輸入輸出來看一個具體的例子這是我在測試網(wǎng)上經(jīng)常用來教學(xué)的一筆交易結(jié)構(gòu)輸入部分引用1個UTXO面額10個幣來源于地址A。輸出部分地址B收到6個幣地址A的找零地址收到3.8個幣。手續(xù)費(fèi)10 - 6 - 3.8 0.2個幣歸礦工所有。你可以把手續(xù)費(fèi)理解成“輸入總額減輸出總額剩下的部分”。這個差額不需要單獨(dú)填一個“手續(xù)費(fèi)”字段它天然就是輸入減輸出的結(jié)果。正因如此構(gòu)造交易時必須細(xì)心如果找零給少了多出來的差額會全部變成手續(xù)費(fèi)如果找零給多了算錯金額可能會把幣白白發(fā)到錯誤地址。我在教學(xué)時常要求學(xué)生手工構(gòu)造一筆標(biāo)準(zhǔn)交易不借助錢包庫。目的是讓大家親眼看到一筆交易里輸出不是簡單的“收款人地址金額”而是“對方地址金額”和“自己找零地址金額”同時存在的。很多人一開始只寫一個輸出結(jié)果一大半金額被扣成手續(xù)費(fèi)只好回來補(bǔ)找零這就是不懂UTXO模型的典型癥狀。4. 從發(fā)起到上鏈廣播、打包與確認(rèn)的完整傳播過程4.1 交易在網(wǎng)絡(luò)里怎么跑來跑去交易構(gòu)造并簽名好之后第一時間被發(fā)送到你連接的節(jié)點(diǎn)。接下來節(jié)點(diǎn)不會把交易發(fā)給全網(wǎng)所有節(jié)點(diǎn)而是轉(zhuǎn)發(fā)給與自己相連的若干鄰居節(jié)點(diǎn)。每個鄰居節(jié)點(diǎn)獨(dú)立驗(yàn)證后如果通過再繼續(xù)轉(zhuǎn)發(fā)給它們的鄰居。這種擴(kuò)散方式類似“一傳十、十傳百”專業(yè)術(shù)語叫泛洪傳播。在這個傳播過程里最值得注意的一點(diǎn)是不同節(jié)點(diǎn)收到交易的時間不同因此全網(wǎng)不存在“同一時刻統(tǒng)一狀態(tài)”。這導(dǎo)致了后面要講的雙花問題。對于開發(fā)者來說還有一個實(shí)踐點(diǎn)廣播交易建議同時連接多個節(jié)點(diǎn)而不是只連一個。因?yàn)槿绻麊蝹€節(jié)點(diǎn)臨時故障或同步滯后你無法確定交易是否真的進(jìn)入了主干網(wǎng)絡(luò)。我在測試網(wǎng)階段就吃過虧交易已構(gòu)造成功但節(jié)點(diǎn)連接不穩(wěn)定導(dǎo)致長時間卡在本地最后換了幾條線路重新廣播才被確認(rèn)。4.2 內(nèi)存池交易上鏈前的暫存區(qū)每個節(jié)點(diǎn)在驗(yàn)證交易通過后并不馬上把它寫進(jìn)區(qū)塊鏈而是放進(jìn)一個臨時緩沖池叫內(nèi)存池。內(nèi)存池是已廣播但尚未被打包進(jìn)區(qū)塊的交易集合。節(jié)點(diǎn)會繼續(xù)把這個交易轉(zhuǎn)發(fā)給鄰居同時等待礦工把它選進(jìn)新區(qū)塊。內(nèi)存池的大小會直接影響你的交易體驗(yàn)網(wǎng)絡(luò)擁堵時大量交易擠在池子里礦工自然優(yōu)先挑手續(xù)費(fèi)高的。手續(xù)費(fèi)低的交易可能在池子里待幾小時甚至幾天。我記得有一次網(wǎng)絡(luò)突發(fā)擁堵一個費(fèi)率設(shè)置偏低的交易卡了將近一天未確認(rèn)花錢一點(diǎn)不少反而因?yàn)橹匕l(fā)追加手續(xù)費(fèi)又虧了一筆。所以構(gòu)造交易時不要盲目使用錢包默認(rèn)費(fèi)率。應(yīng)該先看一眼當(dāng)前網(wǎng)絡(luò)擁堵指數(shù)、內(nèi)存池積壓量再決定費(fèi)率檔位。很多錢包的“自定義手續(xù)費(fèi)”功能不是擺設(shè)而是成熟用戶必須學(xué)會使用的工具。4.3 區(qū)塊打包那一刻發(fā)生了什么礦工在打包新區(qū)塊時會從內(nèi)存池挑選一批交易放進(jìn)區(qū)塊。挑選邏輯很簡單誰給的手續(xù)費(fèi)高、誰更有利于礦工收益誰就被優(yōu)先打包。被選中的交易進(jìn)入新區(qū)塊后區(qū)塊被廣播出去其他節(jié)點(diǎn)驗(yàn)證新區(qū)塊合法便把它接到自己維護(hù)的鏈上。新區(qū)塊生成后該區(qū)塊里的交易獲得1個確認(rèn)數(shù)。每隔一段時間具體時長取決于鏈的設(shè)計(jì)又挖出下一個區(qū)塊如果這個新區(qū)塊是接著前一個區(qū)塊挖的那么前一個區(qū)塊里的交易確認(rèn)數(shù)就變成2。確認(rèn)數(shù)的作用我留在最后專門講。這里有個開發(fā)者容易忽略的細(xì)節(jié)打包進(jìn)區(qū)塊不等于“永不可撤銷”。嚴(yán)格說是確認(rèn)數(shù)越深被回滾的概率越低。有些初學(xué)做礦池監(jiān)控或區(qū)塊瀏覽器的同學(xué)只圖展示最新區(qū)塊卻忘了給用戶標(biāo)記“該交易確認(rèn)數(shù)尚淺建議等待”這種產(chǎn)品設(shè)計(jì)是要出問題的。5. 手續(xù)費(fèi)的計(jì)算邏輯與實(shí)際避坑5.1 手續(xù)費(fèi)公式輸入減輸出的差額手續(xù)費(fèi)的計(jì)算公式前面已經(jīng)提到簡潔說就是手續(xù)費(fèi) 輸入UTXO總額 - 所有輸出UTXO總額在UTXO模型里這個差額不是系統(tǒng)“扣”出來的而是你構(gòu)造交易時自己決定的。輸出總額比輸入總額少多少少掉的部分就是獎勵給打包礦工的手續(xù)費(fèi)。因此構(gòu)造交易時如果完全忘記設(shè)置找零多出來的錢全部變成手續(xù)費(fèi)不是退給你。實(shí)際操作中錢包替你做了這些事掃描UTXO、選擇輸入、計(jì)算找零、預(yù)留手續(xù)費(fèi)。但如果你打算手寫裸交易或者做批量轉(zhuǎn)賬工具就必須自己掌握這套計(jì)算邏輯否則分分鐘虧錢。5.2 費(fèi)率與字節(jié)數(shù)如何決定最終費(fèi)用決定一筆交易具體付多少手續(xù)費(fèi)的不只是金額大小而是交易數(shù)據(jù)的字節(jié)數(shù)和費(fèi)率。可以把費(fèi)率理解成“每字節(jié)支付的聰數(shù)”不同鏈單位不同。交易包含的輸入越多、輸出越多數(shù)據(jù)量越大需要支付的手續(xù)費(fèi)就越高。一個典型單輸入、雙輸出的交易大約兩百多字節(jié)。如果費(fèi)率是每字節(jié)若干聰手續(xù)費(fèi)就是這個字節(jié)數(shù)乘以費(fèi)率。當(dāng)網(wǎng)絡(luò)擁堵時費(fèi)率水漲船高原本便宜的轉(zhuǎn)賬可能變得非常昂貴。我見過一些新手在做小額轉(zhuǎn)賬時因?yàn)閿y帶了大量小額UTXO作為輸入導(dǎo)致交易體積膨脹手續(xù)費(fèi)甚至超過了轉(zhuǎn)賬金額本身。這不是危言聳聽而是UTXO模型下非常常見的現(xiàn)象。打包輸入前可以先計(jì)算一下地址下的UTXO分布盡量選擇面額合適、數(shù)量較少的UTXO組合控制交易體積。對頻繁轉(zhuǎn)賬的錢包還可以定期做UTXO整合把零散小額合并成較大面額降低后續(xù)交易成本。5.3 實(shí)操中常見的三個手續(xù)費(fèi)問題第一費(fèi)率給太低導(dǎo)致交易遲遲不確認(rèn)。這種情況不要慌張可以等待網(wǎng)絡(luò)空閑也可以使用交易替換機(jī)制按更高費(fèi)率重新廣播。前提是原交易構(gòu)造時預(yù)留了相應(yīng)條件否則只能干等。判斷標(biāo)準(zhǔn)很簡單看它是否在內(nèi)存池里被大量節(jié)點(diǎn)接受。第二發(fā)送方和接收方對手續(xù)費(fèi)理解不一致。P2P交易里手續(xù)費(fèi)只從輸入總額跟輸出總額的差額中產(chǎn)生不存在“對方付手續(xù)費(fèi)”這種說法。雙方約定“我轉(zhuǎn)你X手續(xù)費(fèi)我出”實(shí)際效果是輸出給對方的金額等于X輸入總額減去輸出總額的差額由轉(zhuǎn)賬方承擔(dān)。第三批量轉(zhuǎn)賬時不注意輸入輸出配比。一次給幾十個地址轉(zhuǎn)賬輸入不變輸出幾十個交易體積急劇增加手續(xù)費(fèi)可能比你預(yù)期的貴很多。遇到這種場景必須提前估算字節(jié)數(shù)而不是按普通轉(zhuǎn)賬的費(fèi)率直接套。6. 雙花攻擊與到賬安全確認(rèn)數(shù)到底該等幾個6.1 雙花問題的根源雙花全稱是雙重支付指的是同一筆錢被花兩次。在傳統(tǒng)金融里銀行余額扣減可以防止雙花但在P2P網(wǎng)絡(luò)里節(jié)點(diǎn)收到交易的時間有先后同一個UTXO可能會被構(gòu)造進(jìn)兩筆不同交易并分別在不同區(qū)域網(wǎng)絡(luò)中傳播。結(jié)果就是網(wǎng)絡(luò)上出現(xiàn)兩筆都引用了同一UTXO的沖突交易且各自都通過了一部分節(jié)點(diǎn)的初步驗(yàn)證。誰先被礦工打包進(jìn)區(qū)塊誰就在鏈上“勝出”。另一筆沖突交易會在被打包時因UTXO已被花費(fèi)而被拒絕。雙花問題的根源不是密碼學(xué)破解而是分布式系統(tǒng)的時間差。攻擊者可以利用這個時間差先讓收款方看到一筆交易出現(xiàn)在網(wǎng)絡(luò)里再通過更高費(fèi)率的沖突交易把相同UTXO花到別處讓原本那筆交易最終無法上鏈或者上鏈后被回滾。6.2 為什么“等幾個確認(rèn)”是硬規(guī)矩理解雙花之后“等確認(rèn)”的必要性就非常清晰了。交易被打包進(jìn)第一個區(qū)塊只說明一個礦工接受了它并不代表全網(wǎng)都接受了它。假如攻擊者算力足夠可以在不公開的情況下先暗自挖一條包含另一筆沖突交易的鏈等他公開的鏈追上來并超過原鏈長度時原鏈上的交易就會被拋棄這筆交易就發(fā)生了回滾。確認(rèn)數(shù)越深攻擊者要推翻這條鏈需要的算力成本就越高。到了第6個確認(rèn)攻擊者需要持續(xù)多挖好幾個區(qū)塊才能追上并超越成本急劇上升對小額交易來說完全不劃算。所以“等6個確認(rèn)”不是社區(qū)拍腦袋定的規(guī)則而是概率安全模型的工程選擇。人性化的建議是小額即時轉(zhuǎn)賬可以等1到3個確認(rèn)涉及較大金額時至少等6個確認(rèn)更大金額或高價值資產(chǎn)建議等待更久。我見過一些做電商收幣的商家為了用戶體驗(yàn)選擇“零確認(rèn)”放行結(jié)果被雙花攻擊。后來他們改成小額零確認(rèn)、大額等確認(rèn)的分級策略才算穩(wěn)住。這個教訓(xùn)值得所有做支付類產(chǎn)品的開發(fā)者記住。6.3 不同金額場景下的確認(rèn)數(shù)參考下面這張表是我在實(shí)際項(xiàng)目里常用的確認(rèn)參考不是絕對標(biāo)準(zhǔn)但可以幫你建立直覺場景建議等待確認(rèn)數(shù)說明買杯咖啡級別的小額支付0-1風(fēng)險低可接受極少數(shù)異常一般電商購物2-3兼顧體驗(yàn)與安全大額轉(zhuǎn)賬、資產(chǎn)交易6及以上雙花成本已很高足夠安全高價值NFT、長期資產(chǎn)托管12及以上極端保守防鏈重組開發(fā)測試1即可圖快練手用途確認(rèn)數(shù)不是“等滿就永久安全”它是概率性的。確認(rèn)數(shù)越多回滾概率越低但永遠(yuǎn)不是嚴(yán)格意義上的零。做技術(shù)方案設(shè)計(jì)時要把這個概率思維刻在腦子里而不是死記硬背某個數(shù)字。6.4 鏈重組別在最壞情況下才想起來鏈重組是P2P交易里最容易被忽略的概念。簡單說當(dāng)一條鏈因?yàn)槌鰤K速度領(lǐng)先而取代了另一條出現(xiàn)過的鏈時原本已經(jīng)被“確認(rèn)”的交易可能會被回滾。區(qū)塊瀏覽器上顯示的確認(rèn)數(shù)不是絕對承諾而是當(dāng)前主鏈狀態(tài)下的累計(jì)深度。在實(shí)際運(yùn)營中我最擔(dān)心的是用戶看到交易在區(qū)塊瀏覽器里顯示了幾個確認(rèn)就把資產(chǎn)放行了但項(xiàng)目方用的是算力相對較小的網(wǎng)絡(luò)區(qū)塊產(chǎn)生間隔又不穩(wěn)定鏈重組概率比大網(wǎng)絡(luò)更高。這種情況下等更多確認(rèn)不是保守而是必要。你可以像我一樣做一個“確認(rèn)數(shù)閾值動態(tài)調(diào)整”的小工具根據(jù)網(wǎng)絡(luò)當(dāng)前算力和重組歷史自動給出建議值而不是一直寫死一個數(shù)字。另外提醒一句確認(rèn)數(shù)只解決“這筆交易是否被鏈上接受”的問題不解決“對方是否是騙子”的問題。P2P交易沒有仲裁方你在鏈上轉(zhuǎn)出資產(chǎn)后如果對方不履行承諾給你發(fā)貨你沒有任何機(jī)構(gòu)可以申訴。因此做交易對手評估、分階段付款、啟用第三方托管腳本是把P2P交易用于真實(shí)業(yè)務(wù)時必須考慮的配套方案。坦白說P2P交易原理真正難的不是概念而是這些概念之間的因果關(guān)系少數(shù)幾個密碼學(xué)環(huán)節(jié)環(huán)環(huán)相扣任何一個點(diǎn)想不明白后面寫代碼和排查問題都會卡殼。如果你現(xiàn)在正在做錢包、做區(qū)塊瀏覽器或者只是想讓自己的資產(chǎn)處于自己能掌控的地方建議你親手在測試網(wǎng)上試一次手工構(gòu)造交易從生成私鑰、推導(dǎo)地址到簽名廣播全部自己來一遍。試過一次之后什么UTXO、什么確認(rèn)數(shù)都會變得非常直觀。下一篇我打算接著講交易腳本與多簽地址的底層邏輯那會是P2P交易原理的進(jìn)一步延伸也是從“轉(zhuǎn)賬”走向“可編程資產(chǎn)”的橋頭堡。