日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 物聯(lián)網 > 區(qū)塊鏈
[導讀] 區(qū)塊鏈是二十一世紀最具革命性的技術之一,它正在不斷成熟,它的諸多潛力正在逐步實現(xiàn)中。本質上來看,區(qū)塊鏈只不過是一個分布式的數據庫。之所以區(qū)塊鏈獨特,是因為它并不是一個私有數據庫,而是一個公開的數

區(qū)塊鏈是二十一世紀最具革命性的技術之一,它正在不斷成熟,它的諸多潛力正在逐步實現(xiàn)中。本質上來看,區(qū)塊鏈只不過是一個分布式的數據庫。之所以區(qū)塊鏈獨特,是因為它并不是一個私有數據庫,而是一個公開的數據庫,即,每一個使用它的人擁有這個數據庫的全部或者至少一部分。任何一個新的數據記錄,只能在多數數據庫持有者(維護者)的多數同意之后被加入數據庫。正因如此,區(qū)塊鏈使得加密貨幣以及智能合約成為可能。
?

在這個系列文章中,我們將打造一個簡化版本的加密貨幣,它將基于一個簡化版本的區(qū)塊鏈實現(xiàn)。

區(qū)塊(Block)

讓我們先從區(qū)塊開始。在區(qū)塊鏈里,價值信息存儲在區(qū)塊之中。比如,比特幣的區(qū)塊存儲交易記錄,而交易記錄是任何加密貨幣的核心。除此之外,區(qū)塊里還包含有技術信息,比如它的版本號,當前的時間戳,以及上一個區(qū)塊的哈希(Hash)。

在這篇文章中,我們所實現(xiàn)的并不是像比特幣那樣完整的區(qū)塊鏈,而是一個簡化版本的區(qū)塊鏈,它只含有最基本的核心信息。差不多是這樣:

type Block struct {

Timestamp int64

Data []byte

PrevBlockHash []byte

Hash []byte}

TImestamp 是當前的時間戳(即,區(qū)塊被創(chuàng)建的時間),Data 是區(qū)塊中包含的價值信息,PrevBlockHash 存儲的是上一個區(qū)塊的哈希,而Hash 保存的是當前區(qū)塊的哈希。在比特幣的標配中,TImestamp、PrevBlockHash、Hash是區(qū)塊的頭部數據(Block headers),構成一個單獨的數據結構;而交易記錄(TransacTIons,在我們這個版本中就是 Data),是另外一個單獨的數據結構。而我們在這里為了簡化,把數據結構混在了一起。

那我們如何計算哈希呢?計算哈希的方式是區(qū)塊鏈的重要特征之一,也正是這個特性使得區(qū)塊鏈如此安全。關鍵在于,計算哈希是一個計算起來很困難的工作,它需要時間,哪怕是在很快的計算機上(這就是為什么人們要買比 CPU 計算能力更強悍 GPU 甚至專門的 ASIC 芯片做礦機的 原因)。這是故意如此設計的,這么做的結果是,往區(qū)塊鏈(數據庫)里添加新的區(qū)塊(數據)有一定的困難,以此保證一旦新的數據被加入,往后很難篡改。以后的文章里會進一步討論并實現(xiàn)這個機制。

現(xiàn)在呢,我們只需要罷區(qū)塊里的各個字段關聯(lián)起來,并在此基礎上計算出一個 SHA-256 哈希。讓我們調用一下 SetHash這個方法:

func (b *Block) SetHash() {

TImestamp := []byte(strconv.FormatInt(b.Timestamp, 10))

headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})

hash := sha256.Sum256(headers)

b.Hash = hash[:]

}

接下來,依據 Golang 的常用方式,我們將實現(xiàn)一個函數,以便更簡單地創(chuàng)建區(qū)塊:

func NewBlock(data string, prevBlockHash []byte) *Block {

block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}

block.SetHash() return block

}

就這么簡單。

區(qū)塊鏈(Blockchain)

現(xiàn)在,讓我們來實現(xiàn)區(qū)塊鏈。本質上來看,區(qū)塊鏈只不過是一個特定結構的數據庫,它是一個有序的,反向鏈接的列表(back-linked list)。這就意味著說,區(qū)塊是按照插入的順序排列的,每個區(qū)塊都鏈接到上一個區(qū)塊。這樣的結構,使得使用者可以很快地在區(qū)塊鏈中獲得最新的區(qū)塊,也可以很有效率地通過區(qū)塊的哈希獲得某個區(qū)塊。

在 Golang 中,這種結構可以用數組(Array)與數圖(Map) 實現(xiàn):數組用來維護有序哈希(在 Go 語言中,數組是有序的);數圖(Map) 用來維護 hash → block 對。不過,在我們的區(qū)塊鏈原型中,我們只需要數組就可以了,因為我們暫時不需要通過哈希獲取區(qū)塊。

type Blockchain struct {

blocks []*Block

}

這就是我們的第一個區(qū)塊鏈!我從來沒想到竟然會這么簡單!

現(xiàn)在,我們要想辦法往區(qū)塊鏈里添加區(qū)塊了:

func (bc *Blockchain) AddBlock(data string) {

prevBlock := bc.blocks[len(bc.blocks)-1]

newBlock := NewBlock(data, prevBlock.Hash)

bc.blocks = append(bc.blocks, newBlock)

}

這就完事兒了?或者……?

為了添加新的區(qū)塊,我們需要一個已經存在的區(qū)塊,可現(xiàn)在我們的區(qū)塊鏈里面沒有任何區(qū)塊!于是,在任何區(qū)塊鏈中,應該至少有一個區(qū)塊,這第一個區(qū)塊,被稱為“創(chuàng)始塊”(Genesis Block)。來,讓我們實現(xiàn)一個方法去創(chuàng)建這個“創(chuàng)始塊”:

func NewGenesisBlock() *Block { return NewBlock(“Genesis Block”, []byte{})

}

現(xiàn)在我們就可以創(chuàng)建一個函數,用來創(chuàng)建一個已含有“創(chuàng)始塊”的區(qū)塊鏈了:

func NewBlockchain() *Blockchain { return &Blockchain{[]*Block{NewGenesisBlock()}}

}

讓我們來看看這區(qū)塊鏈是否能用?

func main() {

bc := NewBlockchain()

bc.AddBlock(“Send 1 BTC to Ivan”)

bc.AddBlock(“Send 2 more BTC to Ivan”) for _, block := range bc.blocks {

fmt.Printf(“Prev. hash: %x ”, block.PrevBlockHash)

fmt.Printf(“Data: %s ”, block.Data)

fmt.Printf(“Hash: %x ”, block.Hash)

fmt.Println()

}

}

輸出結果是:

Prev. hash:

Data: Genesis Block

Hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168

Prev. hash: aff955a50dc6cd2abfe81b8849eab15f99ed1dc333d38487024223b5fe0f1168

Data: Send 1 BTC to Ivan

Hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1

Prev. hash: d75ce22a840abb9b4e8fc3b60767c4ba3f46a0432d3ea15b71aef9fde6a314e1

Data: Send 2 more BTC to Ivan

Hash: 561237522bb7fcfbccbc6fe0e98bbbde7427ffe01c6fb223f7562288ca2295d1

(竟然)完工!

結論

我們創(chuàng)建了一個極簡的區(qū)塊鏈原型:它只不過是一個由區(qū)塊構成的數組,每個區(qū)快鏈接指向上一個區(qū)塊。當然,真正的區(qū)塊鏈遠比這個復雜的多。在我們的區(qū)塊鏈里,添加一個新區(qū)塊非??欤浅H菀?;但是在真正的區(qū)塊鏈中添加一個新的區(qū)塊需要更多的工作:在獲得添加區(qū)塊的允許之前要做很繁重的計算才行(這個過程被稱為工“作證明機制”,即,“Proof-of-Work”,POW)。并且,區(qū)塊鏈是一個沒有主權的分布式的數據庫。因此,任何一個新的區(qū)塊在被加入之前,必須經過網絡中其它參與者的確認與允許(這個機制被稱為“共識機制”,“Consensus”)…… 還有,我們的區(qū)塊鏈里,還沒有任何交易記錄呢!

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉