位元幣進一步學習 針對作弊問題的處理

2021-09-07 08:41:19 字數 2325 閱讀 1190

這個裡面講了區塊鏈的內容:

《位元幣私鑰、公鑰、錢包位址之間的關係》

講了位元幣交易的過程,基本就懂了(尤其是防止作弊的這一塊。所有的交易,是由扣除方發起的。接收方是沒有權力發起的)

1. 首先使用隨機數發生器生成乙個『私鑰』。一般來說這是乙個256bits的數,擁有了這串數字就可以對相應『錢包位址』中的位元幣進行操作,所以必須被安全地儲存起來。

2. 『私鑰』經過secp256k1演算法處理生成了『公鑰』。secp256k1是一種橢圓曲線演算法,通過乙個已知『私鑰』時可以算得『公鑰』,而『公鑰』已知時卻無法反向計算出『私鑰』。這是保障位元幣安全的演算法基礎。

3. 同sha256一樣,ripemd160也是一種hash演算法,由『公鑰』可以計算得到『公鑰雜湊』,而反過來是行不通的。

4. 將乙個位元組的位址版本號連線到『公鑰雜湊』頭部(對於位元幣網路的pubkey位址,這一位元組為「0」),然後對其進行兩次sha256運算,將結果的前4位元組作為『公鑰雜湊』的校驗值,連線在其尾部。

5. 將上一步結果使用base58進行編碼(位元幣定製版本),就得到了『錢包位址』。 

比如, 1a1zp1ep5qgefi2dmptftl5slmv7divfna

可以看到:

位元幣錢包間的轉賬是通過交易(transaction)實現的。交易資料是由轉出錢包『私鑰』的所有者生成,也就是說有了『私鑰』就可以花費該錢包的位元幣餘額。生成交易的過程如下:

1. 交易的原始資料報括「轉賬數額」和「轉入錢包位址」,但是僅有這些是不夠的,因為無法證明交易的生成者對「轉出錢包位址」餘額有動用的權利。所以需要用『私鑰』對原始資料進行簽名。

2. 生成「轉出錢包公鑰」,這一過程與生成『錢包位址』的第2步是一樣的。

3. 將「轉出簽名」和「轉出公鑰」新增到原始交易資料中,生成了正式的交易資料,這樣它就可以被廣播到位元幣網路進行轉賬了。

交易資料被廣播到位元幣網路後,節點會對這個交易資料進行檢驗,其中就包括對簽名的校驗。如果校驗正確,那麼這筆餘額就成功地從「轉出錢包」轉移到「轉入錢包」了。

如果乙個『錢包位址』從未曾傳送餘額到其他『錢包位址』,那麼它的『公鑰』是不會暴露在位元幣網路上的。而公鑰生成演算法(secp256k1)是不可逆的,即使『公鑰』暴露,也很難對『私鑰』的安全性造成影響(難易取決於『私鑰』的生成演算法)。

『私鑰』用來生成『公鑰』和『錢包位址』,也用來對交易進行簽名。擁有了『私鑰』就是擁有了對這個錢包餘額的一切操作權力。所以,保護『私鑰』是所有位元幣錢包應用最基本也是最重要的功能。

下面這篇文章也有一些內容,寫的比較細節。有一些概念可以看看。

為了去中心化,需要乙個p2p網路,也就是節點之間的地位是平等的,每個節點都可以儲存乙份全域性賬單。現在問題是如何保證各個節點之間賬單的一致性。研究表明,p2p網路能保證乙個「弱一致性」,於是我們的需求稍微退一步,就變成了:

1.      會有部分節點的賬單暫時與全網賬單不同步

2.      整個系統最終會統一到乙個賬單下來

3.      當出現賬單衝突時(像剛才的例子,小a分別和小b、小c各做了乙份賬單),最後會按照乙個可預計的方式解決(比如時間在前面的才有效)

4.      系統必須可以抵禦sybil攻擊

防禦sybil攻擊

在分布式系統中取得一致性的方法,本質都是「少數副總多數的投票制」,大部分節點認為正確的當前賬單就是最後的合法唯一賬單。這個環節會有很多問題,哪些人可以參與投票?每個人投票的權重一樣嗎?

假設所有人都可以投票的話,按照之前的機制,只需要一對金鑰就可以試圖修改那個全域性賬單了,如果某乙個惡意參與者通過程式偽造大量金鑰對,試圖達到大多數然後修改賬單呢?這就是sybil攻擊。

就好像**交易刷單一樣,通過程式,大量偽造的客戶可以下很多假單,然後刷信譽,怎麼辦?有乙個辦法,就是讓刷單的行為變得「昂貴」,例如每次下單,**要收一塊錢交易費,這樣刷一萬個信譽是要付出一萬元的成本的。

如果要欺騙或者作弊,要快到什麼程度呢?目前數學給出的答案是,要能戰勝全網50%的計算力才行。一旦p2p網路到了成千上萬個節點的時候,想達到這個計算力是不可能的,這也是位元幣自稱去中心化的基礎。

而且要求絕大多數節點作弊,那這個本身也不可行。因為位元幣和區塊鏈的乙個基礎就是——少數服從多數。

Looper Handler進一步學習

package com.test.looper import android.os.bundle import android.os.handler import android.os.handlerthread import android.os.looper import android.os....

Sevlet進一步學習

request物件與response物件是tomcat建立的,不需要我們建立。requst物件的一些常用方法 獲取請求引數通用方式 不論get還是post請求方式都可以使用下列方法來獲取請求引數 string getparameter string name 根據引數名稱獲取引數值 username...

html 進一步學習

標籤 基本格式 lang en charset utf 8 titletitle head body html 不是標籤,而是一種宣告,讓瀏覽器知道 html 是用什麼版本編寫的,這裡表示用的 html5 版本 這裡類似於程式語言中主函式或者主方法,也就是乙個入口,整個 html 從這裡開始,並且所...