比特幣交易費及size計算
交易費
大多數交易包含交易費(礦工費),這是為了確保網路安全而給比特幣礦工的一種補償。費用本身也作為一個安全機制,使經濟上不利於攻擊者通過交易來淹沒網路。對於挖礦、費用和礦工得到的獎勵,在挖礦一章中將有更詳細的討論。
這一節解釋交易費是如何被包含在一個典型的交易中的。大多數錢包自動計算並計入交易費。但是, 如果你以程式設計方式構造交易,或者使用命令列介面,你必須手動計算並計入這些費用。
交易費作為礦工打包(挖礦)一筆交易到下一個區塊中的一種激勵;同時作為一種抑制因素,通過對每一筆交易收取小額費用來防止對系統的濫用。成功挖到某區塊的礦工將得到該區內包含的礦工費, 並將該區塊新增至區塊鏈中。
交易費是基於交易的千位元組規模來計算的,而不是比特幣交易的價值。總的來說,交易費是根據比特幣網路中的市場力量確定的。礦工會依據許多不同的標準對交易進行優先順序排序,包括費用,他們甚至可能在某些特定情況下免費處理交易。但大多數情況下,交易費影響處理優先順序,這意味著有足夠費用的交易會更可能被打包進下一個挖出的區塊中;反之交易費不足或者沒有交易費的交易可能會被推遲,基於盡力而為的原則在幾個區塊之後被處理,甚至可能根本不被處理。交易費不是強制的,而且沒有交易費的交易最終也可能會被處理,但是,交易費將提高處理優先順序。
隨著時間的推移,交易費的計算方式以及在交易處理優先順序上的影響已經產生了變化。起初,交易費是固定的,是網路中的一個固定常數。
在 Bitcoin Core 中,費用傳遞政策由minrelaytxfee選項設定。 目前預設的minrelaytxfee是每千位元組0.00001比特幣或者millibitcoin的1%。 因此,預設情況下,費用低於0.0001比特幣的交易是免費的,但只有在記憶體池有空間時才會被轉發; 否則,會被丟棄。 比特幣節點可以通過調整minrelaytxfee的值來覆蓋預設的費用傳策略。
任何建立交易的比特幣服務,包括錢包,交易所,零售應用等,都必須實現動態收費。動態費用可以通過第三方費用估算服務或內建的費用估算演算法來實現。如果您不確定,那就從第三方服務開始,如果您希望去除第三方依賴,您應當有設計和部署自己演算法的經驗。
費用估算演算法根據網路能力和“競爭”交易提供的費用計算適當的費用。這些演算法的範圍從十分簡單的(最後一個塊中的平均值或中位數)到非常複雜的(統計分析)均有覆蓋。他們估計必要的費用(以位元組為單位),這將使得交易具有很高的可能性被選擇並打包進一定數量的塊內。大多數服務為使用者提供高、中、低優先費用的選擇。高優先順序意味著使用者支付更高的交易費,但交易可能就會被打包進下一個塊中。中低優先順序意味著使用者支付較低的交易費,但交易可能需要更長時間才能確認。
小貼士:靜態費用在比特幣網路上不再可行。 設定靜態費用的錢包將導致使用者體驗不佳,因為交易往往會被“卡住”,並不被確認。 不瞭解比特幣交易和費用的使用者因交易被“卡住” 而感到沮喪,因為他們認為自己已經失去了資金。
下面費用估算服務bitcoinfees.21.co中的圖表顯示了10個satoshi / byte增量的費用的實時估計,以及每個範圍的費用交易的預期確認時間(分鐘和塊數)。 對於每個收費範圍(例如,61-70 satoshi /位元組),兩個水平欄顯示過去24小時(102,975)中未確認交易的數量(1405)和交易總數,費用在該範圍內。 根據圖表,此時推薦的高優先費用為80 satoshi / 位元組,這可能導致交易在下一個塊(零塊延遲)中開採。 據合理判斷,一筆常規交易的大小約為226位元組,因此單筆交易建議費用為18,080 satoshis(0.00018080 BTC)。
運用費用估算API
$ curl https://bitcoinfees.21.co/api/v1/fees/recommended
{"fastestFee":80,"halfHourFee":80,"hourFee":60}
API通過費用估算以 satoshi per byte 的方式返回一個 JSON 物件,從而實現”最快確認“ (fastestFee),以及在三個塊(halfHourFee)和六個塊(hourFee)內確認。
\
size 的計算公式
1)方式1
在比特幣的交易中,如果礦工費用設定過高或者過低,交易都不能成功生成,所以我們還需要計算交易中的礦工費用,這裡有一個公式可以大致預估出交易所需的 size,然後將 size 再乘以 每位元的價格
就可以得到礦工費用了。
size = inputsNum * 148 + outputsNum * 34 + 10 (+/-) 40
- inputNum 指交易中的 Input 個數
- outputNum 指交易中的 Output 個數
- 最後一部分是加減更加精確的做法 40
更加精確的做法
方式2)通過bitcoinjs
//使用測試網路 #正式環境把testnet去掉
var testnet = bitcoin.networks.testnet//獲得簽名交易的物件
var alice = bitcoin.ECPair.fromWIF
('cTRWz1dALytHZP3WVdGDjmi5Z9gijqPjmzTM6C2BwHQQ3EqNtNQW',testnet);//獲得構建交易的物件
const test_txb = new bitcoin.TransactionBuilder(testnet)
test_txb.setVersion(2)
test_txb.addInput('93dcd13d86e540dbb58f9d705ebc5dfe1ec6bfc1161b5f84d230cc6ad819e09a',1)
test_txb.addOutput('2MwpK3YP1QpTB9WNSrixATRegwLPaGrZCRF',9995788 )
test_txb.addOutput('mqgEi75mTAJWbHABQ6PsbSfrXzUcZBeM4s',200000000)
//簽署交易
test_txb.sign(0,alice)
//交易hexvar rawtransaction = test_txb.build().toHex();
//獲得size具體大小var size = rawtransaction.length/2
-
測試網區塊瀏覽器地址:
此交易hash:c376f70c3e77519841c7b3088ad19f9a22c56cc57410ff4ec3f84c737696a875
https://test-insight.bitpay.com/tx/c376f70c3e77519841c7b3088ad19f9a22c56cc57410ff4ec3f84c737696a875