10-BTC-問答

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

1、轉賬交易時如果接收者不在線怎麼辦?
這個時候不需要接收者在線,轉賬交易只不過是在區塊鏈上記錄一下,把一個人賬戶上的比特幣轉移到他人的賬戶上,他人是否當時連接在比特幣網絡上是沒有影響的。

2、假設某個全節點收到了一個轉賬交易,有沒有可能轉賬交易中接收者的收款地址是這個
節點以前從來沒有聽說過的?

這是可能的。比特幣賬戶在創建的時候是不需要通知其他人的,在本地產生一個公私鑰對就可以了。只有在產生收款地址以後第一次收到錢時,其他節點才知道這個賬戶的存在。

3、如果賬戶的私鑰丟失了,該怎麼辦?
私鑰丟失之後是沒有辦法的。該賬戶上的錢就變成了死錢,永遠取不出來了。在去中心化的系統裏,是沒有人可以給你重置密碼的。

另外,有些加密貨幣交易時,一般來說交易所是中心化的機構。在交易所開辦一個賬戶的時候,一般是要提供身份證明的。這種情況下把比特幣保存在交易所裏,私鑰實際上是由交易所來保管的。登錄這個交易所是按照登錄銀行差不多的程序,即一個賬戶名一個密碼,一般來說需要二次驗證,比如 Google 身份驗證器產生一次性密碼,通過二次驗證然後登錄。

這種情況下如果賬戶密碼丟失了,是可以跟交易所聯繫的,通過身份驗證之後重置密碼。有一些在線錢包也提供保管私鑰的功能,但比特幣或加密貨幣的交易所處於一種缺乏監管的狀態,這個跟股票交易所是很不一樣的。歷史上曾發生很多次加密貨幣的交易所被黑客攻擊的情況。最著名的是日本的 Mt.Gox 的事件,它曾經是全世界最大的一個比特幣交易所,交易量佔到了全球比特幣交易量的 70%,後來被黑客攻擊,丟失了大量的比特幣。後來交易所破產了,其 CEO 被判刑。各種加密貨幣交易所出現問題的情況發生了很多次,也有內部監管不當,管理人員卷錢跑路也時常發生。相比之下,一些冷錢包和硬錢包是比較安全的。

4、如果私鑰泄露了怎麼辦?
比如你發現自己賬戶上出現一些可疑的交易,這個時候該怎麼辦?這時應該儘快把自己賬上的錢轉到另外一個安全的賬戶上,這個也跟我們平時的生活體驗不太一樣,如果在銀行賬戶上出現一些可疑的交易,我們首先想到的是通知銀行,能否把密碼重置,賬戶凍結,免得別人把錢取走,而這些在區塊鏈的世界裏都是做不到的。

比特幣賬戶所謂的密碼是什麼?就是它的私鑰。公私鑰對生成之後是沒有辦法改的。可以生成一個新的賬戶,但是原來賬戶上的私鑰是改不了的。同樣,也無法阻止別人發佈,從這個賬戶上轉賬的交易,任何有私鑰的人都可以發佈一個轉賬交易,把賬戶上的錢轉走,這個也是沒有辦法凍結的。所以我們能做的就是在第一時間搶在別人之前,把自己賬戶上的錢轉到一個安全的賬戶上。

5、如果轉賬的時候寫錯了地址怎麼辦?
這是沒有辦法的。如果寫錯了地址而轉錯了人,我們也沒有辦法取消已經發布了的交易,比特幣當中轉賬交易一旦發佈到區塊鏈裏,就沒有辦法取消了。當轉錯了地址,如果我們知道是轉給了誰,可以跟對方進行聯繫。如果不知道轉的是誰的地址,或者是不存在的地址,那就沒有辦法了。

什麼叫不存在的地址?地址是公鑰取哈希得到的。有些地址其實不是公鑰的哈希得來的,比如第一節課曾講的 digital commitment 的例子。你想把某項內容的哈希值發佈到區塊鏈上,證明你曾在某個時間知道某個事情。

在前面講比特幣腳本的時候,有個經典的說法,比如把哈希值放到 return 的後面,因爲 OP_RETURN 後寫什麼都是沒有人管的。但是有人會用哈希值生成一個看上去像是比特幣地址的東西。比如 A→B,正常情況下 B 是某個比特幣賬戶公鑰取哈希之後得到的地址。在這裏把他要保存的那個哈希值生成一個地址,作爲收款人的地址。這個地址是沒有對應的私鑰的,它其實是個假的地址,比特幣系統並不知道這個地址的真假,你這個哈希是怎麼來的,別人也看不出來。所以這樣轉賬的錢就變成了死錢。這個轉賬永遠不可能被取出來。

這種做法一般犧牲一點比特幣,比如轉很少一點錢,換取往這個區塊鏈裏寫入這個哈希值的機會。這個做法是不提倡的,因爲這樣的話轉賬交易的輸出會永久的保存在 UTXO 裏面。全節點收到這樣一個轉賬交易,它其實並不知道你的地址的真假,它不知道你的錢其實是花不出去的,所以它必須把它永久的保存起來,這樣對全節點是不友好的。

接着問一個問題:proof of burn 、OP_RETURN 這些實際當中是怎麼操作的?

當一個全節點收到一個轉賬交易的時候,它首先要檢查一下,這個交易的合法性,只有合法的交易纔會被寫入區塊鏈裏。而 OP_RETURN 這個語句是無條件的返回錯誤,既然如此,它怎麼可能通過驗證,怎麼可能被寫到區塊鏈裏呢?

驗證當前交易合法性的時候,不會執行這個語句。即當前交易的輸出腳本在驗證交易合法性的時候,是不會被執行的。只有有人想花這筆錢,後面再有一個交易,要花這個交易的輸出的時候纔會執行這個交易的輸出腳本。

6、挖礦時會不會有的礦工偷答案?
不會。發佈的區塊裏有 coinbase transaction,裏面有一個收款人地址,是挖到礦的礦工的地址。假如 A 挖到了礦,裏面就是 A 的收款地址。如果要偷答案的話,就要把 A 的地址換成自己的地址,而地址如果一變化,coinbase transaction 的內容就發生了改變。

這樣會導致什麼?導致 merkle tree 的根哈希值變化,因爲這個交易和區塊中所包含的其他交易是合在一起構成了 merkle tree。任何一個地方發生改變,根哈希值就會變。而 nonce 是在塊頭裏面,根哈希值也是在塊頭裏面,block header 的內容發生了變化之後,原來找到的 nonce 就作廢了。所以不可能偷答案,因爲每個礦工挖到的 nonce 是和他自己的收款地址綁定在一起的。

7、怎麼判斷交易費該給哪個礦工?即事先怎麼知道哪個礦工會挖到礦?
事先不需要知道哪個礦工會得到這個交易費。交易費是怎麼算的?total inputs>total outputs,其差額就是交易費。發佈的交易裏面,一個交易可以有很多個輸入,也可以有很多個輸出,總輸入減總輸出就是交易費。給誰不需要事先知道,哪個礦工挖到礦了,就可以把這個區塊裏所包含的交易差額收集起來,作爲他自己的交易費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章