比特幣交易的輸入輸出例題
❶ 比特幣交易構成 你知道多少
交易類型
產量交易(Generation)
每個Block都對應一個產量交易(Generation TX),該類交易是沒有輸入交易的,挖出的新幣是所有幣的源頭。
合成地址交易(Script Hash)
該類交易的接收地址不是通常意義的地址,而是一個合成地址,以3開頭,需要幾對公私鑰一起生成合成地址,在生成過程中可以指定,幾對公私鑰中的幾個簽名以後,就可以消費該地址的比特幣。
通用地址交易(Pubkey Hash)
該類是最常見的交易類型,由N個輸入、M個輸出構成。
輸入和輸出可以御橋旦簡單的理解成,發出幣的地址就是輸入,收到幣的地址就是輸出。
數據結構
字鎮擾段
數據類型
欄位大小
欄位描述
versionuint32_t
4交易數據結構的版本號tx_in countvar_int1+輸入交易的數量tx_intx_in[]41+輸入交易的數組,每個輸入=41位元組
tx_out countvar_int1+輸出地址的數量tx_outtx_out[]9+輸入地址的數組,每個輸入=9位元組lock_timeuint32_t4
lock_time是一個多意欄位,表示在某個高度的Block之前或某個時間點之前該交易處於鎖消慎定態,無法收錄進Block。
值
含義
0立即生效 500000000含義為Block高度,處於該Block之前為鎖定(不生效)= 500000000含義為Unix時間戳,處於該時刻之前為鎖定(不生效)
若該筆交易的所有輸入交易的sequence欄位,均為INT32最大值(0xffffffff),則忽略lock_time欄位。否則,該交易在未達到Block高度或達到某個時刻之前,是不會被收錄進Block中的。
示例
為了演示方便,我們讀取稍早期的塊數據,以高度116219 Block為例。
# ~ bitcoind getblock
{
hash : ,
confirmations : 144667,
size : 1536,
height : 116219,
version : 1,
merkleroot : ,
tx : [
,
,
,
,
],
time : 1301705313,
nonce : 1826107553,
bits : 1b00f339,
difficulty : 68977.78463021,
previousblockhash : ,
nextblockhash :
}
該Block裡面有5筆交易,第一筆為Generation TX,解析出來看一下具體內容:
# ~ bitcoind getrawtransaction 1
{
hex : ,
txid : ,
version : 1,
locktime : 0,
vin : [
{
coinbase : 0439f3001b0134,
sequence : 4294967295
}
],
vout : [
{
value : 50.01000000,
n : 0,
scriptPubKey : {
asm : OP_CHECKSIG,
hex : 41ac,
reqSigs : 1,
type : pubkey,
addresses : [
]
}
}
],
blockhash : ,
confirmations : 145029,
time : 1301705313,
blocktime : 1301705313
}
Generation TX的輸入不是一個交易,而帶有coinbase欄位的結構。該欄位的值由挖出此Block的人填寫,這是一種「特權」:可以把信息寫入貨幣系統(大家很喜歡用系統中的數據結構欄位名來命名站點,例如blockchain、coinbase等,這些詞的各種後綴域名都被搶注一空)。中本聰在比特幣的第一個交易中的寫入的coinbase值是:
coinbase:722062616e6b731
將該段16進制轉換為ASCII字元,就是那段著名的創世塊留言:
The Times 03/Jan/2009 Chancellor on brink of second lout for banks1
接下來展示的是一個三個輸入、兩個輸出的普通交易:
# ~ bitcoind getrawtransaction 1
{
hex : ,
txid : ,
version : 1,
locktime : 0,
vin : [
{
txid : ,
vout : 0,
scriptSig : {
asm : 01 ,
hex :
},
sequence : 4294967295
},
{
txid : ,
vout : 1,
scriptSig : {
asm : 01 ,
hex :
},
sequence : 4294967295
},
{
txid : ,
vout : 1,
scriptSig : {
asm : 1d01 ,
hex :
},
sequence : 4294967295
}
],
vout : [
{
value : 0.84000000,
n : 0,
scriptPubKey : {
asm : OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG,
hex : 76a91488ac,
reqSigs : 1,
type : pubkeyhash,
addresses : [
]
}
},
{
value : 156.83000000,
n : 1,
scriptPubKey : {
asm : OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG,
hex : 76a91488ac,
reqSigs : 1,
type : pubkeyhash,
addresses : [
]
}
}
],
blockhash : ,
confirmations : 147751,
time : 1301705313,
blocktime : 1301705313
}5859606162636465666768
欄位hex記錄了所有相關信息,後面顯示的是hex解析出來的各類欄位信息。下面把逐個分解hex內容(hex可以從上面的直接看到):
01000000 // 版本號,UINT32
03 // Tx輸入數量,變長INT。3個輸入。
/*** 第一組Input Tx ***/
// Tx Hash,固定32位元組
00000000 // 消費的Tx位於前向交易輸出的第0個,UINT32,固定4位元組
8a // 簽名的長度, 0x8A = 138位元組
// 138位元組長度的簽名,含有兩個部分:公鑰+簽名
47 // 簽名長度,0x47 = 71位元組
01
41 // 公鑰長度,0x41 = 65位元組
ffffffff // sequence,0xffffffff = 4294967295, UINT32, 固定4位元組
/*** 第二組Input Tx。與上同理,省略分解 ***/
ffff
/*** 第三組Input Tx ***/
2fffffffff
02 // Tx輸出數量,變長INT。兩個輸出。
/*** 第一組輸出 ***/
00bd010500000000 // 輸出的幣值,UINT64,8個位元組。位元組序需翻轉,~= 0x000000000501bd00 = 84000000 satoshi
19 // 輸出目
❷ 關於比特幣guiminer挖礦軟體的問題
比特幣是個好點子嗎?不,比特幣是個滑稽的壞主意。這是個騙局。騙局。它不是貨幣,作為比特幣生態系統基礎的經濟學假設是可笑的,而且忽略了數百年來累積的不同貨幣如何協調運作的知識。
幸運的是這是一個如此漏洞百出的系統,因此它大概永遠不會成長到一個足以對世界經濟產生導致不良效應或影響的地步。
然而,我覺得有必要指出問題所在。
所宣揚的比特幣,更類似於數據傳輸系統而不是現金交易系統。好吧,,問題在於它達成交易並不是提供一個以美元計價的數字現金交易,而是通過導入一個全新的貨幣。那麼這里我們就會問,這真的是可取的嗎?
致命症結之一:分配初始財富
美聯儲印鈔票時,它不會給成千上萬的美國人隨機簽發百萬美元支票。它做的工作,要麼是:1,在自由市場上購買一些其他的資產(通常是美國國債),以此為系統注入比以前更多的現金;或者,2,借貸資金給銀行,銀行再貸款給其他人,最後花掉這些錢。
重要的在於,這些人並不是免費獲取金錢的。他們要麼出售資產換取現金,要麼借錢花並最終還回來(也付利息)。
比特幣系統沒有一個中央銀行發行貨幣,它有個「演算法」,通過頗為費解的機制讓比特幣被「挖掘」出來。基本上是隨機分配給了早進入嘗鮮的人們。這是一個對早期進入者非常有利的系統(免費的金錢!)。對真實的貨幣而言這是個荒謬的制度,更不用說這明顯的缺少擴展性(如果每一個人都終日挖礦會後果怎麼樣?)為了解決這個問題,比特幣的供應在演算法上被加以限制,這再一次地給早期進入者帶來實惠,但是這一點通向第二個問題:
致命症結之二:內生的通貨緊縮
經濟學課程時間了!通貨緊縮現象產生於貨幣相對於其他商品升值(比如商品價格下降了)。更直接地說,通貨緊縮產生於當人們期望貨幣相對其他商品升值,物價趨勢持續下降的時候。
問題:如果預期錢要升值,為什麼你要花掉它?答案:一般而言,你就不會去花錢了。
比特幣的供給被設定為一個速率可知的減速發行。最終達到大約2100萬。如圖。
速率可知 — 好吧,我同意,如果說是可預見的通貨膨脹,從經濟學角度來看未必可取,但是還說得過去。然而如果說是減速發行的話,假如你來設計一種要顛覆世界秩序的貨幣,你更願意看到的其實是這種圖:
那麼如果說至少有恆定的增長率呢?你也許願意那麼做,因為那是適應更多人使用它的唯一途徑。
但是比特幣不是設計來成為一種實用貨幣的,它被設計來讓早期進入者發家致富。這再一次地表明這是個騙局。
作一個快速思考實驗,我們假定對比特幣的需求增長,更多的人們使用它,這樣一來,可以預期比特幣的美元標價就快速上升。現在假設我有一個比特幣,我也有一張美鈔,我願意買一瓶百事可樂,我會使用哪種支付手段?顯然貶值中的美元更應該被花掉,而不是快速升值的比特幣。
在最好的情況下,比特幣供給的限制會造成嚴重的通貨緊縮,榨取掉多數比特幣計價的商業行為,縱容交易市場上的投機買賣。假如你都不願意使用,別人也不願意使用,所謂透明度與低交易費的好處不會帶給你任何實惠。
致命症結之三:缺少可兌換性
人們對所謂貨幣內在價值的認定有個誤解,其實沒有什麼所謂的貨幣內在價值。鈔票名義上的價值僅僅止於他們能交易換取的別的鈔票。一美元價值等同於一定數額的歐元,一歐元等價於一定量的日元,一日元等價於一定量的美元。1美元可以存在銀行,換個存款證明,存款證明隨後就能再換成1美元。它可以變成商業或個人支票,然後再變為現金或者存起來。你旅行時它可以變成旅行支票換成日元或歐元。如果你要花錢買三明治,三明治店收錢也是因為錢能轉換成別的東西。這是美妙的循環平衡。
❸ 比特幣挖礦究竟在計算一個什麼問題手動驗證區塊鏈給出答案
簡單回顧下挖礦的流程。
首先先要對所有的交易做驗證,剔除有問題的,然後通過一套自定義的標准來選擇哪些交易希望打包進區塊,比如說提供的交易費與交易佔用的位元組大小的比值超過某個門檻,這樣的交易才被認為有利可圖。當然,節點也可以特意選擇要加入某條交易,或者故意忽略某些交易。如果是通過礦池挖礦的話,礦池的伺服器會去篩選交易,然後分配給每個參與的礦機一個獨立的任務。
一旦篩選好交易數據,層層約減,通過這些交易就可以計算出一棵Merkle樹,可以確定一個唯一的摘要,這就是Merkl樹的根。
然後我們再依次獲取挖礦需要的其他信息,這些信息組成一個區塊的頭。
區塊頭的位元組分配
區塊頭只有80個位元組,挖礦只需要對區塊頭進行運算即可。交易數據都通過merkle樹固定了下來,不需要再包含進來。
這些信息中大部分已經是固定下來的,或者是可計算的。
我們以區塊277316為例,其信息來自網站 http://blockchain.info
Bitcoin Block #277316blockchain.info
選擇這個區塊的原因是在《Mastering Bitcoin》一書中,中文社區譯本和英文原版在介紹這部分內容時有出入,而且作者Antonopoulos並沒有提到一個關鍵點,就是位元組順序的問題,相信很多人可能會踩這個坑。這里還原的細節可以幫助讀者與書籍做相互參考。
請大家注意下面的每個步驟,注意每一個變化,這是比特幣最核心的演算法。
轉換時間,記住,一定要轉為utc的時間戳,此處遇到過坑,小心。
這一步的發現異常艱辛,耗費了大量的查詢,大坑,大坑,謹記。發明人中本聰可能為了讓機器計算更快,而變為了更接近機器的編碼方式little-endian.
最終得到的結果就是
16進制下前面15個0,然後是1; 而難度目標對應的數字是
16進制下前面15個0,然後是3. 計算結果小於難度目標,符合要求。這個結果與網站上公布的數字一致。
在挖礦時,nonce隨機數是未知的,要從0試到2^32,但是這個數字其實不大,只有4294967296,以現在的礦機動輒14T每秒的算力,全部算完到上限也不需要一秒。剛才提到在這種情況下,需要使用創幣交易中的附帶信息,額外的字元串成為extra nonce。
另外,創世區塊也可以通過上面的方法來驗證,有好奇的朋友可以嘗試下。
提示:
❹ 當你向朋友轉了兩個比特幣,在交易的過程中你提交了哪些信息給礦工
地址、金額、手續費、比特幣簽名
傳統轉賬是在銀行賬戶之間進行的。同樣,比特幣轉賬就是把比特幣從一個比特幣地址轉移到另一個比特幣地址上的過程。它的轉賬過程也類似:
①登陸錢包:你需要登陸你的錢包,類似登陸銀行的網銀、支付寶、微信等;
②選擇錢包地址:你先選好要從自己哪個比特幣地址轉幣給你的朋友,也就是自己的銀行卡號(或者支付寶賬號微信賬號)。
③填寫轉賬錢包地址、金額、手續費、比特幣簽名、礦工記賬:填寫好朋友收幣的比特幣錢包地址,填寫轉賬的數額、比如100個然後寫下你想付出的交易手續費金額,簽上你的比特幣簽名,提交給比特幣網路,然後就等礦工們來處理記賬了。
④轉賬確認:確定支付後交易信息會在比特幣網路進行全網廣播,礦工每隔10分鍾會將比特幣網路中未被記賬的交易打包進一個區塊,這就完成了一次確認,此時比特幣已轉到對方賬戶。通常需要經過6次確認,確保交易記錄不能被任何人竄改,轉賬才算真正完成。
❺ 交易及記賬(上) | 小白學比特幣之二
在 精讀「Mastering Bitcoin」1 中, 提到比特幣不僅是一個 電子現金 (系統),也是一個公開的賬本,這賬本上記錄了每筆交易的信息。用比特幣交易,其實就跟我們用人民幣或者美元交易買賣東西一樣。作者給比特幣交易行為的定義是:
那麼,在比特幣系統里,是以什麼樣的形式將這些交易記錄下來的呢?
跟傳統記賬一樣,在比特幣系統中也對交易採用復式記賬的方法 (double-entry bookkeeping ledger),直白點翻譯就是雙入口記賬。復式記賬,簡單理解就是以下兩點 [1] :
每一筆交易都要至少在兩個賬戶上進行記錄 ,在會計記賬中有三個基本賬戶也就是資產賬戶、負債賬戶以及所有者權益賬戶,跟會計等式 資產(Assets) = 負債 (Liabiliteis) + 所有者權益 (Equity) 是一一對應的。那麼單獨每個賬戶又是以怎麼樣的方式呈現出來的呢?方法是每個賬戶都需要記錄這個賬戶的debits和credits(見上圖):
說完復式記賬,再回到《Mastering Bitcoin》(精通比特幣) ,在書中,作者給出的記賬例子如下面那張截圖;一筆交易中可以包含多個Input和output。這里的Input和output如何理解呢?
總結一下:
通過作者這句話, 可以看到比特幣系統其實執行的是價值交易。更進一步地,可以理解為價值的輸入和輸出。
上筆交易和下筆交易之間會形成一個「無形的鏈」:
作者用一張圖形象的說明了什麼是「交易鏈」。
對於同一個地址而言,上一筆交易中的output將會作為下一筆交易的輸入,這樣就形成了一個交易鏈。
在上面的交易截圖中,我們可以看到這幾筆交易里有 spent 、 unspent 和 change 。 change 為找零地址,為什麼會有找零地址呢?
比特幣系統中的找零概念和平時用現金交易的找零概念是一樣的,如果你要買一個1塊錢的包子,但是你身上只有一張20塊錢的紙幣,這個時候就需要包子鋪老闆找給你19元零錢。
在比特幣系統中,每一個input就相當於一定面值的紙幣。如果一筆交易中只包含一個Input,為20個BTC,當這個地址向其他地址支付1個BTC時候,就需要對方找還19個BTC。不同的是,比特幣不像紙幣那樣只有幾種面值固定的紙幣,比特幣系統可以隨時創建「新面值」。
出於保護隱私的考慮,找零地址沒必要跟原先的付款地址一樣,通常錢包會生成一個新的找零地址。
在真實應用中,並不會在找零地址旁邊標注 change 的字樣,如下圖顯示(截圖來自blockchain.info上的某筆交易),
比特幣系統可以隨時創建「新面值」來用於找零,而且這「零錢」可以用於下次交易。在每個輸出(output)記錄里,可消費的比特幣數量會被標記成 unspent ,這樣的輸出有一個專門的名字叫做 Unspent Transaction Outputs (UTXO)。可以把unspent的輸出理解為面值不同的、可用於下次消費的紙幣,就好像10元面值紙幣、100元面值紙幣那樣。
[1] Mastering Bitcoin 第二版 https://github.com/bitcoinbook/bitcoinbook
[2] http://learnmeabitcoin.com
❻ 全網近4萬人爆倉,比特幣價格走高,投資時仍需要注意哪些問題
全網近4萬人爆倉,比特幣價格走高,這些不禁讓我想到了貳零一八年的金融暴雷事件,一夜之間,P2P暴雷,讓無數人感受到了黑暗。現在比特幣這種情況,真的不知道該如何評價。投資,也希望大家都在保證正常生活的前提下投資,省的出現了岔子沒有辦法收場。
三、花出去的錢才是自己的錢。雖然我知道這句話的價值觀不一定正確,看似在鼓勵大家消費,事實不就是如此嗎?辛辛苦苦的血汗錢,一夜之前什麼都沒有了。但是欠銀行的房貸,確實真實的,銀行的存款,也一直在縮水,不知道怎麼評價這種病態的消費觀,到處都在鼓動著我們花錢,但是錢從哪裡掙呢?沒有一點點存款,遇到危急的時刻我們還不是一樣的走投無路。投資,還是老老實實的存款吧,實在不行,風險分攤。