一次簽名btc
① 為什麼比特幣交易過程要將前一筆交易和收款人的公鑰進行哈希變化並數字簽名,其中前一筆交易是什麼
首先,這個做哈希變化並數字簽名是為了記錄這一筆交易並發布到全網,那麼這里說的前一筆交易是在你交易的前一筆交易記錄,因為這是分布式賬本,也就是說每個人的交易在這個賬本上都是有據可查的
② 比特幣的私鑰,公鑰,簽名,錢包,都是什麼意思我下載了一個比特幣客戶端,該怎麼用bitcoin-0.8.5
公私鑰既是飛對等加密,可以看下rsa加密
公鑰加密的內容只有私鑰可以解密
私鑰加密的內容只公鑰可以解密
公鑰在這里既是你的比特幣ID,私鑰既是你錢包
用比特幣需要注意保管好你的錢包,最好給他用密碼加密,若別人知道你的錢包(私鑰),即可使用你的比特幣
網上有很多比特幣交易平台,谷歌搜索一下就可以找到好多
一般賺比特幣要靠挖礦,網上也有挖礦平台,不過現在收益低了,燒顯卡
③ 比特幣多重簽名錢包缺點
比特幣多重簽名錢包缺點:更難轉移資金。
多重簽名錢包使人們更難轉移資金,無論行為是否惡意,因為錢包需要所有或大多數持有人的簽名,具體取決於設置。
加密貨幣錢包的工作方式與普通錢包相同,它們的所有者必須執行交易、支付費用並對其進行身份驗證才能移動它們。
④ 比特幣交易構成 你知道多少
交易類型
產量交易(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 // 輸出目
⑤ 什麼是比特幣的數字簽名
比特幣中的數字簽名,是交易中的發起方產生的,為了保證這筆交易確實是由此人發起,並且數據在傳輸時沒有被篡改。數字簽名簡單點來說,就是完整的交易信息,通過數字摘要技術壓縮成固定格式的字元串,然後通過非對稱加密技術,生成一個私鑰。將完整的交易信息和數字簽名傳送給礦工,礦工用交易發起方的公鑰對數字簽名進行解密,解密成功,就將此交易數據寫到區塊中。
⑥ 比特幣怎麼匯到別人賬戶上
要想理解清楚比特幣是如何轉賬的,我們還是先來看傳統銀行是怎麼轉賬的。
比如今天我要通過中國銀行的網銀給朋友的建設銀行卡轉賬1萬元,我要操作的步驟是:
登錄賬號 → 選擇轉賬 → 輸入1萬元 → 輸入密碼確認 → 等待銀行處理,系統可能會提示需要5元手續費,銀行確認後,最終我賬戶扣除1萬以及手續費,朋友的賬戶增加1萬。
銀行在其中起的作用就是記賬,並收取一定的手續費。
類似點:
比特幣錢包就相當於網銀
比特幣的地址錢包相當於我們的銀行卡
簽上比特幣的簽名相當於輸入確認密碼。
不同點是:
銀行轉賬是銀行來記賬;比特幣轉賬是礦工來記賬
銀行實時處理,實時到賬;比特幣則需要6個區塊的確認才算正式到賬
銀行固定了手續費,比特幣轉賬費用由自己決定,但轉賬費用決定了曠工處理的速度。
⑦ 比特幣的私鑰,公鑰,簽名,錢包,都是什麼意思我下載了一個bitcoin-0.8.5比特幣客戶端,該怎麼用
私鑰就是你的銀行卡密碼,地址就是你的銀行賬號,但是私鑰更重要,有了私鑰可以推出地址,忘了私鑰就啥都沒了,簽名就是個性化設置,加一道驗證手續,錢包就是小atm機,更新完了就可以發,wallet文件保存好就沒事情了,btc中國還行,可以買幣。
⑧ 比特幣如何防止偽造交易記錄
(本文在觀看李永樂老師視頻講解基礎上整理)
防止偽造記錄是比特幣的一個重要特點,電子簽名技術就是防偽的關鍵。
當一個比特幣用戶注冊的時候會產生一個隨機數,隨之會產生一個私鑰,緊接著生成公鑰和地址。
接下來以「A轉給B十個比特幣」作為案例,看一下比特幣的交易是如何防偽的。
Step1:A編寫交易記錄並對信息加密
Step2:A將「交易信息、公鑰、地址」進行全網廣播
Step3:全網對A廣播出來的信息進行驗證
驗證的過程就是全網對廣播出來的交易信息進行哈希運算,並得出一個摘要。然後用廣播出來的公鑰和密碼進行解密,也得出一個摘要。
對這兩個摘要進行對比,如果相同,信息為真,如果不同,信息為假。
以上就是比特幣對信息驗證的過程。
結語
1、 比特幣防偽採取了電子簽名技術;
2、 私鑰加密,公鑰解密;
3、 對廣播出來的信息,全網會進行信息驗證,驗證通過代表信息真實,否則信息偽造。
參考文獻
[1]微博 @李永樂老師
⑨ 比特幣基礎知識 你絕對想不到
橢圓曲線數字簽名演算法
橢圓曲線數字簽名演算法(ECDSA)是使用橢圓曲線對數字簽名演算法(DSA)的模擬,該演算法是構成比特幣系統的基石。
私鑰
非公開,擁有者需安全保管。通常是由隨機演算法生成的,說白了,就是一個巨大的隨機整數,32位元組,256位。
大小介於1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之間的數,都可以認為是一個合法的私鑰。
於是,除了隨機方法外,採用特定演算法由固定的輸入,得到32位元組輸出的演算法就可以成為得到私鑰的方法。於是,便有了迷你私鑰(Mini Privkey),原理很簡單,例如,採用SHA256的一種實現:
private key = SHA256()1
迷你私鑰存在安全問題,因為輸入集合太小,易被構造常見組合的彩虹表暴力破解,所以通常仿輪納還是使用系統隨機生成的比較好,無安全隱患。
公鑰
公鑰與私鑰是相對應的,一把私鑰可以推出唯一的公鑰,但公鑰卻無法推導出私鑰。公鑰有兩種形式:壓縮與非壓縮。
早期比特幣均使用非壓縮公鑰,現大部分客戶端已默認使用壓縮公鑰。
這個貌似是比特幣系統一個長得像feature的bug,早期人少活多代碼寫得不夠精細,openssl庫的文檔又不足夠好,導致Satoshi以為必須使用非壓縮的完整公鑰,後來大家發現其實公鑰的左右兩個32位元組是有關聯的,左側(X)可以推出右側(Y)的平方值,有左側(X)就可以了。
現在系統里兩種方式共存,應該會一直共存下去。兩種公鑰的首個位元組為標識位,壓縮為33位元組,非壓縮為65位元組。以0x04開頭為非壓縮,0x02/0x03開頭為壓縮公鑰,0x02/0x03的選取由右側Y開方後的奇偶決定。
壓縮形式可以減小Tx/Block的體積,每個Tx Input減少32位元組。
簽名
使用私鑰對數據進行簽署(Sign)會得到簽名(Signature)。通常會將數據先生成Hash值,然後對此Hash值進行簽名。簽名(signature)有兩部分組成: R + S。由簽名(signature)與Hash值,便可以推出一個公鑰,驗證此公鑰,便可知道此簽名是否由公鑰對應的私鑰簽名。
通常,每個簽名會有三個長度:73、72、71,符合校驗的概率為25%、50%、25%。所以每次簽署後,需要找出符合校驗的簽名長度,再提供給驗證方。
地址
地址是為了人們交換方便而弄出來的一個方案,因為公鑰太長了(130字元串或66字元串)。地址長度為25位元組,轉為base58編碼後,為34或35個字元。base58是類似base64的編碼,但去掉了易引起視覺混淆的字元,又在地址末尾添加了4個位元組校驗位,保障在人們交換個別字元錯誤時,也能夠因地址校驗失敗而制止了誤操作。
由於存在公鑰有兩種形式,那麼一個公鑰便對應兩個地址。這兩個地址都可由同一私鑰簽署交易。
公鑰生成地址的演算法:
Version = 1 byte of 0 (zero); on the test network, this is 1 byte of 111
Key hash = Version concatenated with RIPEMD-160(SHA-256(public key))
Checksum = 1st 4 bytes of SHA-256(SHA-256(Key hash))
Bitcoin Address = Base58Encode(Key hash concatenated with Checksum)1234
下圖是非壓縮公鑰生成地址的過程:
對於壓縮公鑰生成地址時,則只取公鑰的X部分即可。
推導關系
三者推導關系:私鑰
公鑰
兩個地址。過程均不可逆。擁有私鑰便擁有一切,但通常為了方便,會把對應的公鑰、地址也存儲起來。
交易
比特幣的交易(Transation,縮寫Tx),並不是通常意義的桐散交易,例如一手交錢一手交貨,而是轉賬。交易由N個輸入和M個輸出兩部分組成。交易的每個輸入便是前向交易的某個輸出,那麼追蹤到源頭,必然出現一個沒有輸入的交易,此類交易稱為CoinBase Tx。CoinBase類備沒交易是獎勵挖礦者而產生的交易,該交易總是位於Block塊的第一筆。
擁有一個輸入與輸出的Tx數據:
Input:
Previous tx:
Index: 0
scriptSig:
241501
Output:
Value: 5000000000
scriptPubKey: OP_DUP OP_HASH160
OP_EQUALVERIFY OP_CHECKSIG12345678910
一旦某個Tx的第N個輸出成為另一個Tx的輸入,那麼該筆比特幣即為已花費。每個交易有唯一Hash字元串來標識,通過對交易數據做兩次SHA256哈希運算而來:
Tx Hash ID = SHA256(SHA256(Tx Data))1
礦工費
礦工費(Transaction Fee)是鼓勵礦工將Tx打包進Block的激勵報酬。計算一筆交易的礦工費:
Transaction Fee = SUM(Inputs amount) - SUM(Outputs amount)1
每筆Tx的礦工費必然大於等於零,否則該筆Tx即為非法,不會被網路接收。
數據塊
數據塊(Block)是存儲Block Meta與Tx的地方。Block的第一筆Tx總是CoinBase Tx,因此Block中的交易數量總是大於等於1,隨後是這段時間內網路廣播出來的Tx。
找到合適的Block是一件非常困難的事情,需要通過大量的數學計算才能發現,該計算過程稱為「挖礦」。首個發現者,會得到一些比特幣作為獎勵。
數據鏈
多個Block連接起來成為數據鏈(Block Chain)。
為了引入容錯與競爭機制,比特幣系統允許Block Chain出現分叉,但每個節點總是傾向於選擇最高的、難度最大的鏈,並稱之為Best Chain,節點只認可Best Chain上的數據。
首個Block稱為Genesis Block,並設定高度為零,後續每新增一個Block,高度則遞增一。目前是不允許花費Genesis Block中的比特幣的。
每個Block中的Tx在此Block中均唯一
一個Tx通常只會在一個Block里,也可能會出現在多個Block中,但只會在Best Chain中的某一個Block出現一次
貨幣存儲
比特幣是密碼貨幣、純數字化貨幣,沒有看得見摸得著的硬幣或紙幣。一個人持有比特幣意味著:
其擁有一些地址的私鑰
這些地址是數筆交易的輸出,且未花費
所有貨幣記錄均以交易形式存儲在整個blockchain數據塊中,無交易無貨幣。貨幣不會憑空產生,也不會憑空消失。遺失了某個地址的私鑰,意味著該地址上的Tx無法簽署,無法成為下一個Tx的輸入,便認為該筆比特幣永久消失了。
貨幣發行
既然所有交易的輸入源頭都是來自CoinBase,產生CoinBase時即意味著貨幣發行。比特幣採用衰減發行,每四年產量減半,第一個四年每個block的coinbase獎勵50BTC,隨後是25btc, 12.5btc, 並最終於2140年為零,此時總量達到極限為2100萬個btc。
減半周期,嚴格來說,並不是准確的四年,而是每生成210000個block。之所以俗稱四年減半,是因為比特幣系統會根據全網算力的大小自動調整難度系統,使得大約每兩周產生2016個block,那麼四年約21萬塊block。
該函數GetBlockValue()用於計算挖得Block的獎勵值:
int64 static GetBlockValue(int nHeight, int64 nFees)
{
int64 nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210000 blocks, which will occur approximately every 4 years
nSubsidy = (nHeight / 210000);
return nSubsidy + nFees;
}123456789
當達到2100萬btc以後,不再有來自CoinBase的獎勵了,礦工的收入來源僅剩下交易的礦工費。此時,每個block的收入絕對值btc很低,但此時比特幣應當會非常繁榮,幣值也會相當的高,使得礦工們依然有利可圖。
杜絕多重支付
傳統貨幣存在多重支付(Double Spending)問題,典型的比如非數字時代的支票詐騙、數字時代的信用卡詐騙等。在比特幣系統里,每筆交易的確認均需要得到全網廣播,並收錄進Block後才能得到真正確認。每筆錢的花銷,均需要檢測上次輸入交易的狀態。數據是帶時間戳的、公開的,BlockChain由巨大的算力保障其安全性。所以比特幣系統將貨幣的多重支付的風險極大降低,幾近於零。通過等待多個Block確認,更是從概率上降低至零。一般得到6個確認後,可認為非常安全。但對於能影響你人生的重大支付,建議等待20~30個確認。
匿名性
任何人均可以輕易生成大量的私鑰、公鑰、地址。地址本身是匿名的,通過多個地址交易可進一步提高匿名性。但該匿名性並不像媒體宣傳的那樣,是某種程度上的匿名。因為比特幣的交易數據是公開的,所以任何一筆資金的流向均是可以追蹤的。
不了解比特幣的人為它的匿名性產生一些擔憂,比如擔心更利於從事非法業務;了解比特幣的人卻因為它的偽匿名性而苦惱。傳統貨幣在消費中也是匿名的,且是法律保障的,大部分國家都不允許個人塗畫紙幣。
地址本身是匿名的,但你可以通過地址對應的私鑰簽名消息來向公眾證明你擁有某個比特幣地址。
其他名詞
哈希
哈希(Hash)是一種函數,將一個數映射到另一個集合當中。不同的哈希函數映射的空間不同,反映到計算機上就是生成的值長度不一樣。同一個哈希函數,相同的輸入必然是相同的輸出,但同一個輸出卻可能有不同的輸入,這種情況稱為哈希碰撞。
常見的哈希函數有CRC32, MD5, SHA1, SHA-256, SHA-512, RIPEMD-160等,哈希函數在計算中有著非常廣泛的用途。比特幣里主要採用的是SHA-256和RIPEMD-160。
腦錢包紙錢包
前面提到過的腦錢包與紙錢包,這其實不算是錢包的分類,只是生成、存儲密鑰的方式而已。腦錢包屬於迷你私鑰的產物。腦錢包就是記在腦袋裡的密鑰,紙錢包就是列印到紙上的密鑰,僅此而已。
有同學提到過,以一個計算機文件作為輸入,例如一個數MB大小的照片,通過某種Hash運算後得到私鑰的方法。這個方案的安全性還是不錯的,同時可以防止盜私鑰木馬根據特徵掃描私鑰。文本形式存儲私鑰是有特徵的,而一個照片文件卻難以察覺,即使放在雲盤等第三方存儲空間中都是安全的。