您好,登錄后才能下訂單哦!
這篇文章主要講解了“Go區(qū)塊鏈怎么實(shí)現(xiàn)交易驗(yàn)證”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Go區(qū)塊鏈怎么實(shí)現(xiàn)交易驗(yàn)證”吧!
在區(qū)塊鏈公鏈的開(kāi)發(fā)圈子里,我們找到了一些流行的編程語(yǔ)言,有C++、Golang、Python和最近新起的Rust等等。
稍微對(duì)比較有名的項(xiàng)目采用的編程語(yǔ)言做個(gè)統(tǒng)計(jì),如下圖:
老一代的公鏈,比如Bitcoin,Litcoin一般使用C/C++較多(我們看看那個(gè)時(shí)間,當(dāng)時(shí)Go還沒(méi)起來(lái)呢),新一代的公鏈比如以太坊,聯(lián)盟鏈翹楚超級(jí)賬本,開(kāi)始較多使用Go語(yǔ)言,當(dāng)然我們看到Rust的發(fā)展勢(shì)頭也很猛,近兩年的很多公鏈比如波卡,Grin都開(kāi)始采用Rust語(yǔ)言開(kāi)發(fā)了。
Go 編譯生成的是一個(gè)靜態(tài)可執(zhí)行文件,除了 glibc 外沒(méi)有其他外部依賴(lài)。這讓部署變得異常方便:目標(biāo)機(jī)器上只需要一個(gè)基礎(chǔ)的系統(tǒng)和必要的管理、監(jiān)控工具,完全不需要操心應(yīng)用所需的各種包、庫(kù)的依賴(lài)關(guān)系,大大減輕了維護(hù)的負(fù)擔(dān)??芍苯泳幾g成機(jī)器碼,不依賴(lài)其他庫(kù),glibc的版本有一定要求,部署就是扔一個(gè)文件上去就完成了。
雖然不如 C 和 Java,但通常比原生 Python 應(yīng)用還是高一個(gè)數(shù)量級(jí)的,適合編寫(xiě)一些瓶頸業(yè)務(wù)。內(nèi)存占用也非常省。
Goroutine 和 channel 使得編寫(xiě)高并發(fā)的服務(wù)端軟件變得相當(dāng)容易,很多情況下完全不需要考慮鎖機(jī)制以及由此帶來(lái)的各種問(wèn)題。單個(gè) Go 應(yīng)用也能有效的利用多個(gè) CPU 核,并行執(zhí)行的性能好。
Go 非常簡(jiǎn)單,且易于學(xué)習(xí)。從學(xué)術(shù)的角度講 Go 語(yǔ)言其實(shí)非常平庸,不支持許多高級(jí)的語(yǔ)言特性;但從工程的角度講,Go 的設(shè)計(jì)是非常優(yōu)秀的:規(guī)范足夠簡(jiǎn)單靈活。正是由于 Go 的簡(jiǎn)單性,任何的 Python、Elixir、C++、Scala 或者 Java 開(kāi)發(fā)者皆可在一月內(nèi)組建成一個(gè)高效的 Go 團(tuán)隊(duì)。
Go目前已經(jīng)內(nèi)置了大量的庫(kù),特別是網(wǎng)絡(luò)庫(kù)非常強(qiáng)大。更重要的是 Go 自帶完善的工具鏈,大大提高了團(tuán)隊(duì)協(xié)作的一致性。比如 gofmt 自動(dòng)排版 Go 代碼,很大程度上杜絕了不同人寫(xiě)的代碼排版風(fēng)格不一致的問(wèn)題。把編輯器配置成在編輯存檔的時(shí)候自動(dòng)運(yùn)行 gofmt,這樣在編寫(xiě)代碼的時(shí)候可以隨意擺放位置,存檔的時(shí)候自動(dòng)變成正確排版的代碼。此外還有 gofix, govet 等非常有用的工具。
Go語(yǔ)言后面的支持者是Google,語(yǔ)言足夠在各種場(chǎng)景下得到檢驗(yàn),同時(shí)創(chuàng)始人還是C語(yǔ)言之父,對(duì)后續(xù)的發(fā)展和創(chuàng)新可期。
Go語(yǔ)言在云時(shí)代得到了比較廣泛的應(yīng)用,特別是Docker和K8s這樣的殺手級(jí)產(chǎn)品的出現(xiàn)讓Go語(yǔ)言在工程界占有一席之地 除此之外Go語(yǔ)言還有非常多的成功運(yùn)行中的軟件: nsq:bitly開(kāi)源的消息隊(duì)列系統(tǒng),性能非常高,目前他們每天處理數(shù)十億條的消息 packer:用來(lái)生成不同平臺(tái)的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者 skynet:分布式調(diào)度框架 Doozer:分布式同步工具,類(lèi)似ZooKeeper Heka:mazila開(kāi)源的日志處理系統(tǒng) cbfs:couchbase開(kāi)源的分布式文件系統(tǒng) tsuru:開(kāi)源的PAAS平臺(tái),和SAE實(shí)現(xiàn)的功能一模一樣 groupcache:memcahe作者寫(xiě)的用于Google下載系統(tǒng)的緩存系統(tǒng) god:類(lèi)似redis的緩存系統(tǒng),但是支持分布式和擴(kuò)展性 gor:網(wǎng)絡(luò)流量抓包和重放工具
除了打鐵還需自身硬之外,還有些機(jī)遇和運(yùn)勢(shì),讓區(qū)塊鏈選擇的了Go語(yǔ)言。我們來(lái)看區(qū)塊鏈2.0以來(lái)最成功的公鏈和聯(lián)盟鏈代表,以太坊和超級(jí)賬本Fabric,無(wú)一例外都選擇使用Go作為開(kāi)發(fā)語(yǔ)言(雖然以太坊其實(shí)也有其他語(yǔ)言的客戶(hù)端版本,但進(jìn)入到Homestead階段以后,Go客戶(hù)端占據(jù)了主導(dǎo)地位),這兩大超級(jí)區(qū)塊鏈的影響力可不是一般項(xiàng)目可以比擬的,不僅在生態(tài)中占據(jù)了大的坑位,事實(shí)上還隱性的制定了區(qū)塊鏈的標(biāo)準(zhǔn),不論是公鏈中的智能合約,還是聯(lián)盟鏈的技術(shù),都繞不開(kāi)以太坊和Fabric,那么對(duì)于一家想要做區(qū)塊鏈技術(shù)選型的公司來(lái)說(shuō),最快捷的實(shí)現(xiàn)是什么?自然是直接照搬這兩個(gè)項(xiàng)目的創(chuàng)新,再捷徑一點(diǎn)就是直接拿開(kāi)源代碼改,那么自然Go語(yǔ)言就成為后來(lái)者的首選,換種語(yǔ)言重新實(shí)現(xiàn)一遍難度也不小,而且如果選擇一些創(chuàng)新但不是非常成熟的語(yǔ)言還會(huì)缺失一些特定庫(kù)的支持從而導(dǎo)致項(xiàng)目無(wú)法開(kāi)展。
很多人對(duì)以太坊的影響力毋庸置疑,但實(shí)際上Fabric在企業(yè)區(qū)塊鏈部署上的影響力更不容小覷:
Hyperledger Fabric是已部署的企業(yè)區(qū)塊鏈網(wǎng)絡(luò)中使用最多的協(xié)議框架,超級(jí)賬本Hyperledger(其中Fabric作為旗艦協(xié)議)是集成商和軟件開(kāi)發(fā)平臺(tái)最常支持的協(xié)議框架,比例達(dá)到了53%。 而在所有的區(qū)塊鏈技術(shù)書(shū)籍里面,有關(guān)超級(jí)賬本的書(shū)籍是賣(mài)的最為火爆這個(gè)事實(shí)也是側(cè)面印證了超級(jí)賬本Hyperledger的影響力。
在選型編程語(yǔ)言的過(guò)程中,考量了C,C++, Java,但C/C++大項(xiàng)目維護(hù)難度大,而Java又略顯笨重,此時(shí)Go語(yǔ)言已經(jīng)在區(qū)塊鏈項(xiàng)目上大放異彩,也逐漸形成技術(shù)和人才的一個(gè)頭部效應(yīng),那么順應(yīng)潮流進(jìn)行技術(shù)選型自然也會(huì)減少初始比原鏈項(xiàng)目遇到的阻力,當(dāng)然在逐漸開(kāi)發(fā)過(guò)程中,我們也感受到了選用Go語(yǔ)言帶來(lái)的便利和優(yōu)勢(shì)。
從技術(shù)上來(lái)說(shuō),區(qū)塊鏈節(jié)點(diǎn)是需要多模塊異步協(xié)同工作的,所以Go語(yǔ)言并發(fā)性和通道就顯得非常有優(yōu)勢(shì),我們看下面交易驗(yàn)證的例子:
func ValidateTxs(txs []*bc.Tx, block *bc.Block) []*ValidateTxResult { txSize := len(txs) //init the goroutine validate worker var wg sync.WaitGroup workCh := make(chan *validateTxWork, txSize) resultCh := make(chan *ValidateTxResult, txSize) closeCh := make(chan struct{}) for i := 0; i <= validateWorkerNum && i < txSize; i++ { wg.Add(1) go validateTxWorker(workCh, resultCh, closeCh, &wg) } //sent the works for i, tx := range txs { workCh <- &validateTxWork{i: i, tx: tx, block: block} } //collect validate results results := make([]*ValidateTxResult, txSize) for i := 0; i < txSize; i++ { result := <-resultCh results[result.i] = result } close(closeCh) wg.Wait() close(workCh) close(resultCh) return results }
我們使用Routine+Ch+WaitGroup在30行代碼之內(nèi),就可以構(gòu)建一個(gè)并發(fā)的驗(yàn)證交易的功能,在高配置的服務(wù)器的情況下,可以跑出10萬(wàn)以上的TPS。
我當(dāng)初進(jìn)入比原之前也沒(méi)有做過(guò)Go語(yǔ)言開(kāi)發(fā),但都能夠很快上手,基本在半個(gè)月內(nèi)能夠參與核心代碼的開(kāi)發(fā)和維護(hù)了(對(duì)于從C/C++/Java有經(jīng)驗(yàn)的開(kāi)發(fā)者尤其快速),這就是語(yǔ)言簡(jiǎn)單對(duì)團(tuán)隊(duì)構(gòu)建帶來(lái)的好處。
從協(xié)作上來(lái)說(shuō),通過(guò)gofmt 自動(dòng)排版 Go 代碼,能夠讓核心團(tuán)隊(duì)成員甚至社區(qū)開(kāi)發(fā)者提交的代碼風(fēng)格的差異性降到最小,提升項(xiàng)目的整體質(zhì)量和可維護(hù)性。
感謝各位的閱讀,以上就是“Go區(qū)塊鏈怎么實(shí)現(xiàn)交易驗(yàn)證”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Go區(qū)塊鏈怎么實(shí)現(xiàn)交易驗(yàn)證這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。