關於區塊鏈的解讀和簡單Python實現
概念解讀
區塊鏈幾乎是數日間成為人盡皆知的名詞,這個名詞也勾起了我強烈的興趣,但是通過在網上搜羅資料,多方閱讀,發現很多介紹區塊鏈的文獻要麼模稜兩可,要麼作者本身的理解也很有限,導致很多關鍵的問題敘述不清。本人花了一些時間總結歸納,希望可以給讀者一個比較全面清晰的認識。
區塊鏈的官方定義是:一個分散式賬本,一種通過去中心化、去信任的方式集體維護一個可靠資料庫的技術方案。那麼對於圈外人該如何理解呢?以下我會詳細描述一個區塊鏈的產生過程和實現意義,從而給大家構建出一個清晰的區塊鏈概念。我們先講原理、再說特點、然後論用途、最後迴歸程式碼,這樣你就會有一種恍然大悟的感覺。
我們以btc為例:“區塊鏈”,顧名思義,就是由一個個區塊依次連線起來組成的鏈條,可以類比為一條無限長度的直線鐵鏈,每個鐵環就是一個區塊。那麼區塊的內容應該是什麼呢?區塊狹義上是有兩種的,一個是普通區塊,一個就是創世區塊。創世區塊就是一項區塊鏈專案中的第一個區塊,由於個人水平有限,對創世區塊沒有做過詳細研究,但是根據我的瞭解,創世區塊應該是具備與普通區塊相似結構的,但會肯定會加入一些創始人想說的東西,並且在有些專案中可能會多一條記錄,就是coin的發行量,例如swtc的6000億數目就是寫在創世區塊之中的,一旦發行,無法修改。
那麼,一個普通區塊中到底有什麼?
1.index:就是從0-n依次產生的數字,可以稱之為鏈高度。
2.hash:一個長度為256位隨機數,是這個區塊的唯一編號。
3.previous hash:上一個區塊的hash,一個普通區塊有且僅有一個previous hash,這就是區塊鏈之所以稱為鏈的原因,就是這麼一環套一環連結而成的。
4.tempstamp:用於記錄該區塊誕生的時間。
5.difficulty:直觀體現創造該區塊的難度。
6.nonce:隨機數,用於產生下一個區塊。
上述的都存在區塊頭中。
7.data:儲存的交易記錄。只有這個存在區塊體中。
Ok,上述提到了一個區塊需要具備的最基本的幾條要素,可能你現在還處於一臉懵逼的狀態:這些東西到底是怎麼工作的呢?下面我將一步步分析區塊鏈的工作過程,不過,這裡要先問兩個問題:為什麼要產生新的區塊?怎麼產生新的區塊?
為什麼產生新區快?
之前說了,一個區塊記錄的就是一份賬單,賬單中儲存著若干條交易記錄,是買賣雙方具體活動的最有力的證明,例如我們在淘寶上的購買記錄,就是我們的消費賬單。人們每天的消費記錄是不斷增長的,不可能永遠放在一個區塊裡,那麼跟現在的中心化儲存機制還有什麼區別?所以,隨著買賣記錄的不斷增加,就需要不斷產生新的區塊來儲存這些資料。
怎麼產生新的區塊?
我相信,最近除了區塊鏈這個名詞如雷貫耳以外,“挖礦”應該也沒少聽吧。挖礦實際上就是由那些礦工來生成新的區塊的過程。在btc專案中,btc礦工挖礦成功(其實就是成功的建立了一個區塊)就可以獲得一定數量的被btc獎勵,所以btc數量是在一定範圍內慢慢增加的。在一般允許挖礦的區塊鏈專案(也存在限制coin數量不允許挖礦的區塊鏈專案)中,礦工的數量一般會大於6個,一般超過6個礦工認可的新區塊就可以加入到區塊鏈中。到此為止,有人會說:哇!btc這麼值錢,挖礦不是很爽?其實不然,如果區塊無限制的快速增加,會引起很大的問題,根據中本聰的設定,目前全網每10分鐘只能產生一個新區塊。而且這10分鐘不是靠自己掐表算的,生成新的區塊是需要大量的運算的,這10分鐘是人家預先設計好的,讓計算量大到全網10分鐘一般只能產生一個。
好了,至此,區塊鏈的基本概念已經介紹的差不多了,下面言歸正傳,講下區塊的工作流程:
1.如果A要和B達成一筆交易,比如A轉給B一個btc,B給A打10w的RMB。A首先將自己的btc來源資訊、交易人等傳送給B,同時還要拷貝一份發到全網。什麼?這樣還有隱私可言嗎?當然,聰明的中本聰當然不會犯這麼低階的錯誤。在區塊鏈中,每個交易個體(也可以理解為每個網路節點)都會有一對公鑰和私鑰,公鑰相當於一個“收款地址”,而私鑰是一個表明自己身份的256位的數字,目前一般是用sha265來生成的,這樣,別人並不知道交易的雙方是誰。傳送報文時,傳送方用一個雜湊函式從報文文字中生成報文摘要,然後用自己的私鑰對摘要進行加密,加密後的摘要將作為報文的數字簽名和報文一起傳送給接收方,接收方首先用與傳送方一樣的雜湊函式從接收到的原始報文中計算出報文摘要,接著再用傳送方的公鑰來對報文附加的數字簽名進行解密,如果這兩個摘要相同、那麼接收方就能確認該數字簽名是傳送方的。
2.那麼此時,這筆交易是否就完成了呢?如果這就算完成了,那跟A直接用包裹裝10w現金快遞給B有什麼區別呢?此時,全網的礦工都會得到這個交易記錄,那麼全網的礦工都會為了若干獎勵開始建立區塊的工作,礦工會利用hash函式生成一個256位的唯一編號賦予這個區塊,但是這個編號並不是簡簡單單隨便生成的。編號是根據區塊的具體內容如交易內容、nonce等唯一確定的,換句話說,兩塊內容相同的區塊所對應的編號一定是唯一的。可是你會問:這又怎麼了?並不難啊。錯!中本聰為了控制區塊的生成時間,使區塊的生成速率滿足全網的每10分鐘一個的標準,制定了嚴格的區塊生成校驗規則,也就是說,能不能生成一個成功的區塊要看你的編號是否符合這個規則。例如:生成編號中的前n位必須為‘0’。
由於區塊的交易內容是無法修改的,因此礦工們只能通過修改nonce去不斷嘗試這個函式,直到生成了一個成功的區塊為止。如果當區塊平均生成時間變快或者變慢,那麼系統會對區塊校驗規則進行相應的調整,從而使平均的生成時間能夠控制在規定範圍。
如果一個礦工完成了一個區塊,會立刻告知其他礦工,如果其他礦工此時沒有完成新的區塊生成,則會停下手頭的工作,對區塊進行驗證,需要確認的資訊主要有如下幾點:
1).區塊的編號有效;這個只要將區塊放入雜湊函式中,看產生的編號是否和該區塊中的編號一致即可。
2).區塊的前一個區塊有效;之前提過,區塊是一個串聯的,每一個普通區塊都會記載前一個區塊的編號,這需要其他礦工對比當前的區塊鏈的最後一個區塊,看是否相同。
3).交易清單有效;就是說要驗證A到底有沒有這一個btc可以給B。在區塊鏈的交易資訊中,會記錄交易中所有btc的前世今生,區塊鏈可以做到追本溯源,因此每一個btc在哪裡,為什麼在這裡都可以一目瞭然,所以這點也沒問題。
當驗證完一個全新的區塊後,全網就會認為這個區塊有效,會將它新增到現有的區塊鏈末端,同時結束針對該區塊的挖礦工作,投入到下一個挖礦週期中。
3.但是不難想象,這樣的機制是存在衝突的隱患的,就是這麼巧,兩個礦工同時製作了一個正確的區塊,那麼此時不必二選一,可以將原來線性的區塊鏈改成樹狀:
但是這樣會導致未來在A、B後都會增加相應的區塊,那麼誰長誰將作為主鏈延伸下去,另一個也許會漸漸被遺忘,除非哪天它變得更長。
好啦,這就是區塊鏈最基本的知識,接下來應該談談優缺點了。
世界上沒有一樣東西可以稱為完美無瑕的,要知道區塊鏈一樣,雖然它被扣上了可以顛覆未來的帽子,但是仍然存在它的侷限性:1.時效性。很容易發現,區塊鏈中存在很多的驗證、傳遞環節,這就會導致其時效性較差。2、能耗,這點也是顯而易見的,區塊鏈需要大量無用計算來控制區塊的生成時間。所以區塊鏈不適用於高時效的網路中。
至於區塊鏈的優點,諸如安全、去中心化等等在網路上已經描述的非常清楚,這裡就不再贅述。接下來我用一段python程式碼來簡單實現一個挖礦的流程。
程式碼示例
首先建立一個表示區塊鏈的類:
class BlockChain: def __init__(self, initialHash): # init block chain self.chain = [] # init pitman self.pitmen = [] for i in range(6): self.pitmen.append(Pitman) # collect mine results self.results = [] # generate GenesisBlock self.new_block(initialHash)
初始化函式中的chain表示當前的區塊鏈,我會在其中儲存區塊物件;pitmen表示為這個區塊鏈服務的礦工們,這個列表中也會存有礦工物件;results則會儲存每個階段產生的區塊;new_block方法是建立區塊的方法,如果當前生成的區塊為第一個區塊,則產生創世區塊。
下面看看區塊鏈型別的方法:
@property def last_block(self): if len(self.chain): return self.chain[-1] else: return None
last_block會返回當前區塊鏈的最後一個區塊物件。
def get_trans(self): return json.dumps({ 'sender': ''.join(random.sample(string.ascii_letters + string.digits, 8)), 'recipient': ''.join(random.sample(string.ascii_letters + string.digits, 8)), 'amount': random.randrange(1, 10000) })get_trans方法則用來隨機生成一份交易資訊。
def new_block(self, initialHash=None): if initialHash: # generate Genesis Block block = Block() block.index = 0 block.nonce = random.randrange(0, 99999) block.previousHash = '0' block.difficulty = 0 block.transactionData = self.get_trans() guess = f'{block.previousHash}{block.nonce}{block.transactionData}'.encode() block.hash = hashlib.sha256(guess).hexdigest() block.time = time() self.chain.append(block) else: for i in range(len(self.pitmen)): pm = MyThread(target=self.pitmen[i].mine, args=(self.pitmen[i], len(self.chain), self.last_block.get_block()['Hash'], self.get_trans())) pm.start() pm.join() self.results.append(pm.get_result()) # show all blocks print("All blocks generated by pitmen:") for result in self.results: print(result[0].get_block()) # get new block firstblock = self.results[0][0] mintime = Decimal(self.results[0][1]) for i in range(1, len(self.results)): if Decimal(self.results[i][1]) < mintime: firstblock = self.results[i][0] else: continue self.chain.append(firstblock) self.results = []這是生成區塊的核心部分,這個方法主要分成兩個部分:根據傳參區分是否是創世區塊,如果需要的是創世區塊,那就由該型別自動生成一個區塊佔據區塊鏈的頭一個位置。如果需要生成的是普通區塊,那麼則會將一些基本資訊分發給礦工們進行挖礦操作。我在這裡設定了6個礦工,為了公平起見,這裡也開了個多執行緒儘量讓礦工們同時收到訊息從而可以同時進行挖礦操作。按理說,最先挖礦成功的礦工會將訊息發給其他礦工,其他礦工會立刻停止進行校驗,但由於時間有限,這一步校驗環節我沒有實現。在這裡,我允許所有礦工都完成工作,並提交成果和相應的工作時間,生成耗時最短的區塊講作為正確的區塊新增到區塊鏈上。本質上也是依照了“快者優先”的區塊鏈生成原則。
說了半天,區塊內部到底是什麼樣的呢?
class Block: def __init__(self): self.index = None self.time = None self.difficulty = None self.nonce = None self.hash = None self.previousHash = None self.transactionData = None def get_block(self): return { 'Index': self.index, 'Time': self.time, 'Difficulty': self.difficulty, 'Hash': self.hash, 'Nonce': self.nonce, 'PreviousHash': self.previousHash, 'TransactionData': self.transactionData }我用了一個相對簡單的型別表示區塊,在這裡區塊就是一個非常簡單的資料結構,這裡的所有欄位在上述中已經有了詳細的說明,因此不再贅述。
那麼我們再看看礦工,畢竟礦工才是區塊鏈的生產者和推動者,地位最為核心。礦工類中我設計了兩個方法,一個mine方法,也就是挖礦的意思,用來生成新的區塊,並會返回該區塊生成的用時長短。
def mine(self, index, previousHash, transactionData): beginTime = time() block = Block() block.index = index block.previousHash = previousHash block.transactionData = transactionData block.difficulty, block.hash, block.nonce = self.generate_hash(previousHash, transactionData) block.time = time() endTime = time() return block, endTime - beginTime
另一個方法是hash生成的方法,生成原則我自己意淫了一個,大家莫怪,因為本人計算機的實在不給力,區塊的成功標準很簡單,就是用sha256生成的編碼最後結尾是0就滿足要求,如果改成00,那會半天看不到結果。
下面我們看下這套例項的執行結果,我設定了一個長度為6的區塊鏈,由於第一個區塊是創世區塊,所以真正開始建立的區塊是從第二個開始的,大家注意index。
這是6個礦工完成的第一區塊:
All blocks generated by pitmen:
{'Index': 1, 'Time': 1516268156.5971138, 'Difficulty': 2, 'Hash': '01f505a276e3f55a868d9ee18f70bcff75429e1de70f5ab59471a3551cc67a30', 'Nonce': 91554, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"OY8z0Rrx", "recipient": "iSGFJsEm", "amount": 8723}'}
{'Index': 1, 'Time': 1516268156.5971138, 'Difficulty': 5, 'Hash': 'c3ba406bad0d87f816f629830a15e2997638bfa230484c224e5470eaa24d8790', 'Nonce': 62372, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"9o8UMDLe", "recipient": "qTOQu7kv", "amount": 2746}'}
{'Index': 1, 'Time': 1516268156.5981123, 'Difficulty': 5, 'Hash': '8ff243885e9017296aa2ef1a611ef5b3927ddce818cb7255a04ff3228c982c60', 'Nonce': 67644, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"kIqy1c8C", "recipient": "WSdK0EXh", "amount": 9329}'}
{'Index': 1, 'Time': 1516268156.5981123, 'Difficulty': 3, 'Hash': 'ff9716bf9379e2ab7a8640419e7c7b7c7329a5e6e1bbf83a1249f49d070ca8b0', 'Nonce': 37336, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"vBwU0luH", "recipient": "d7o6cRCj", "amount": 5628}'}
{'Index': 1, 'Time': 1516268156.5981123, 'Difficulty': 3, 'Hash': '3410c70c31f9bacbfcbd74d63f25f69f27d36075e2d44bddaa60bd72fa042e60', 'Nonce': 34617, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"yzcNpBnh", "recipient": "vbIr7SKo", "amount": 6387}'}
{'Index': 1, 'Time': 1516268156.5981123, 'Difficulty': 27, 'Hash': '91e3dc3ef1a151557a1edd837528410b916362bcfb77dbb14dc54c8929f5a0d0', 'Nonce': 49121, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"p1MguhVz", "recipient": "gVSom4D3", "amount": 7356}'}
很明顯前兩個是最快的,為了簡單,我在最快的裡面隨便選取一個,意思到了就行。大家可以看到,難度值,根據上文所說,這是反應一個區塊生成的難易程度的,難度高的,在我這裡會表示這個礦工為了得到這個區塊進行了多少次嘗試。看到這裡也許你會問:為什麼難度最大的時間並沒有明顯長呢?也就是用時並沒有按照難度的增加而增加。我猜想應該是因為我的示例演算法簡單,因此結果也不是十分精確,如果計算量達到一定的規模,應該會有明顯的差距。(如果有高人知道,可以回覆我,在此謝過!)第三到第六個的區塊建立結果格式是與之一樣的,就不刷屏了。
最後看下整個區塊鏈的結果:
{'Index': 0, 'Time': 1516268156.5971138, 'Difficulty': 0, 'Hash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'Nonce': 87688, 'PreviousHash': '0', 'TransactionData': '{"sender": "OuVCmHbs", "recipient":
"kFxbwSLc", "amount": 503}'}
{'Index': 1, 'Time': 1516268156.5971138, 'Difficulty': 2, 'Hash': '01f505a276e3f55a868d9ee18f70bcff75429e1de70f5ab59471a3551cc67a30', 'Nonce': 91554, 'PreviousHash': '7532402844a1c130833a27600298d09a007d6124603cf44be9c05fcd5428c34a', 'TransactionData': '{"sender":
"OY8z0Rrx", "recipient": "iSGFJsEm", "amount": 8723}'}
{'Index': 2, 'Time': 1516268156.5991132, 'Difficulty': 4, 'Hash': '098544436793881e8041c0c903c96c0055e16396113d73c63bc55e7ba78ec130', 'Nonce': 12875, 'PreviousHash': '01f505a276e3f55a868d9ee18f70bcff75429e1de70f5ab59471a3551cc67a30', 'TransactionData': '{"sender":
"HJZSX1hk", "recipient": "j82k51yY", "amount": 3521}'}
{'Index': 3, 'Time': 1516268156.6001143, 'Difficulty': 27, 'Hash': '7c10243223caf39bc5a6067de8d93f6ea46bad62c4a0fbcc0aa4e086585d8200', 'Nonce': 18663, 'PreviousHash': '098544436793881e8041c0c903c96c0055e16396113d73c63bc55e7ba78ec130', 'TransactionData': '{"sender":
"cJrGxN5R", "recipient": "wkZI8QCv", "amount": 1224}'}
{'Index': 4, 'Time': 1516268156.601114, 'Difficulty': 3, 'Hash': '60a099d3fe53e031800669fcc1d9b5ab6df1f80a40354135310a799892f1c3d0', 'Nonce': 51446, 'PreviousHash': '7c10243223caf39bc5a6067de8d93f6ea46bad62c4a0fbcc0aa4e086585d8200', 'TransactionData': '{"sender":
"nCNJoy52", "recipient": "kYBT9f65", "amount": 3603}'}
{'Index': 5, 'Time': 1516268156.605163, 'Difficulty': 2, 'Hash': '765f69163cf95584721015e3ce819c1980ce33752f8a4dea553d3bedd39f8920', 'Nonce': 31804, 'PreviousHash': '60a099d3fe53e031800669fcc1d9b5ab6df1f80a40354135310a799892f1c3d0', 'TransactionData': '{"sender":
"FqOkiTEu", "recipient": "y9EDcSYA", "amount": 4185}'}
這就是由這6個礦工依次建立的六個區塊,根據hash值環環相扣。
到底我想說的基本就結束了,最後我想說區塊鏈是個神奇的技術,從聽到它就深深的吸引著我,期望未來區塊鏈可以真的帶來巨大的變革。要知道,隨著AI的興起,區塊鏈的問世,屬於程式設計師的數字時代會進一步昇華,網際網路時代只是一個開始!謝謝閱讀,本人水平有限,如果您發現問題或我理解偏差的地方可以及時指出,在本文下方回覆或者郵箱[email protected]都可以,再次表示感謝。文章末尾會附上完整程式碼,本文由作者原創,所有版權歸屬作者。我是隔壁小王。
import hashlib import random import string import json import threading from decimal import Decimal from time import time class MyThread(threading.Thread): def __init__(self, target, args=()): super(MyThread, self).__init__() self.func = target self.args = args def run(self): self.result = self.func(*self.args) def get_result(self): try: return self.result except Exception: return None class BlockChain: def __init__(self, initialHash): # init block chain self.chain = [] # init pitman self.pitmen = [] for i in range(6): self.pitmen.append(Pitman) # collect mine results self.results = [] # generate GenesisBlock self.new_block(initialHash) @property def last_block(self): if len(self.chain): return self.chain[-1] else: return None def get_trans(self): return json.dumps({ 'sender': ''.join(random.sample(string.ascii_letters + string.digits, 8)), 'recipient': ''.join(random.sample(string.ascii_letters + string.digits, 8)), 'amount': random.randrange(1, 10000) }) def new_block(self, initialHash=None): if initialHash: # generate Genesis Block block = Block() block.index = 0 block.nonce = random.randrange(0, 99999) block.previousHash = '0' block.difficulty = 0 block.transactionData = self.get_trans() guess = f'{block.previousHash}{block.nonce}{block.transactionData}'.encode() block.hash = hashlib.sha256(guess).hexdigest() block.time = time() self.chain.append(block) else: for i in range(len(self.pitmen)): pm = MyThread(target=self.pitmen[i].mine, args=(self.pitmen[i], len(self.chain), self.last_block.get_block()['Hash'], self.get_trans())) pm.start() pm.join() self.results.append(pm.get_result()) # show all blocks print("All blocks generated by pitmen:") for result in self.results: print(result[0].get_block()) # get new block firstblock = self.results[0][0] mintime = Decimal(self.results[0][1]) for i in range(1, len(self.results)): if Decimal(self.results[i][1]) < mintime: firstblock = self.results[i][0] else: continue self.chain.append(firstblock) self.results = [] def show_chain(self): print('This is mine first block chain!') for block in self.chain: print(block.get_block()) class Block: def __init__(self): self.index = None self.time = None self.difficulty = None self.nonce = None self.hash = None self.previousHash = None self.transactionData = None def get_block(self): return { 'Index': self.index, 'Time': self.time, 'Difficulty': self.difficulty, 'Hash': self.hash, 'Nonce': self.nonce, 'PreviousHash': self.previousHash, 'TransactionData': self.transactionData } class Pitman: def mine(self, index, previousHash, transactionData): beginTime = time() block = Block() block.index = index block.previousHash = previousHash block.transactionData = transactionData block.difficulty, block.hash, block.nonce = self.generate_hash(previousHash, transactionData) block.time = time() endTime = time() return block, endTime - beginTime @staticmethod def generate_hash(previousHash, transactionData): difficulty = 0 nonce = random.randrange(0, 99999) guess = f'{previousHash}{nonce}{transactionData}'.encode() myhash = hashlib.sha256(guess).hexdigest() while myhash[-1] != '0': difficulty += 1 nonce += difficulty guess = f'{previousHash}{nonce}{transactionData}'.encode() myhash = hashlib.sha256(guess).hexdigest() return difficulty, myhash, nonce if __name__ == '__main__': chain = BlockChain(1) length = 5 for i in range(length): chain.new_block() chain.show_chain()
相關推薦
關於區塊鏈的解讀和簡單Python實現
概念解讀 區塊鏈幾乎是數日間成為人盡皆知的名詞,這個名詞也勾起了我強烈的興趣,但是通過在網上搜羅資料,多方閱讀,發現很多介紹區塊鏈的文獻要麼模稜兩可,要麼作者本身的理解也很有限,導致很多關鍵的問題敘述不清。本人花了一些時間總結歸納,希望可以給讀者一個比較全面清晰的認識。
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈技術發展路線圖
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈技術發展路線圖 區塊鏈通用技術需求 區塊鏈應用的技術需求,除分散式系統、密碼學演算法、成員管理等通用技術外,還包括以下技術需求: 1、模組化與外掛化 2、高效能 3、資料一致性
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈標準體系框架
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈標準體系框架 區塊鏈標準體系框架 1、基礎標準2、業務和應用標準3、過程和方法標準4、可信和互操作標準 5、資訊保安標準 區塊鏈標準化重點方向 基礎標準:基礎標準對區塊鏈技術研發和應用發展的核心
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈典型應用場景
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈典型應用場景 區塊鏈典型應用場景 3.2 區塊鏈與金融服務 應用場景1:支付領域 應用場景2:資產數字化 應用場景3:智慧證券 應用場景4:清算和結算 應用場景5:客戶
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈發展生態
BC:帶你溫習並解讀《中國區塊鏈技術和應用發展白皮書》—區塊鏈發展生態 區塊鏈發展生態 隨著區塊鏈技術的演進,越來越多的機構開始重視並參與到區塊鏈技術的探索中來。從最初的以比特幣、以太坊等公有鏈專案開源社群,到各種型別的區塊鏈
基於Tendermint的區塊鏈漂流瓶簡單實現
本文主要借demo介紹基於Tendermint的區塊鏈應用開發,這個demo很簡單,主要包含以下功能: 扔漂流瓶 撈漂流瓶 之後投放者和打撈者可以相互傳遞[加密]資訊 程式碼已上傳至github。 Tendermint Tendermint幫我們實現了PBFT,相當於搭了一個共識框架,
數據庫並行讀取和寫入(Python實現)
ews for rom join() rgs one val connect ssi max_process = 16 #最大進程數 def read_SQL_write(r_host,r_port,r_user,r_passwd,r_db,r_charset,w_host
C 雙向鏈表的簡單排序實現
rtb swap 結構 code str 表頭 urn else 重新 今天偶爾看到了C結構體的單項鏈表。 於是重新溫習了下雙向鏈表,重寫了下雙向鏈表的簡單排序實現,當做溫習總結吧。 先定義雙向鏈表 1 struct Student{ 2 int studentI
區塊鏈概述---如何簡單通俗的理解區塊鏈技術
微軟雅黑 ack con 一聲 領域 str 案例 放棄 post 區塊鏈技術被認為是繼蒸汽機、電力、互聯網之後,下一代顛覆性的核心技術。 如果說蒸汽機釋放了人們的生產力,電力解決了人們基本的生活需求,互聯網徹底改變了信息傳遞的方式,那麽區塊鏈作為構造信任的機器,將可能徹
區塊鏈概述---如何簡單的理解區塊鏈技術
content ticket 個數 信用 通過命令 因此 否則 兩個 防止 區塊鏈技術被認為是繼蒸汽機、電力、互聯網之後,下一代顛覆性的核心技術。 如果說蒸汽機釋放了人們的生產力,電力解決了人們基本的生活需求,互聯網徹底改變了信息傳遞的方式,那麽區塊鏈作為構造信任的機器,
Golang區塊鏈開發002-初始化區塊鏈與POW挖礦實現
pow append var space [] sha2 測試結果 rep ring 目錄:一.初始化區塊鏈1.代碼結構2. 定義區塊結構與方法3. 定義區塊鏈結構與方法4. 幫助庫代碼5. 測試生成區塊與初始化區塊鏈6. 測試代碼二. POW挖礦實現1.代碼結構2. 定義
從0到1簡易區塊鏈開發手冊V0.5-實現余額查詢
def nba getaddr 查詢 key dex ani puts += 七. 查詢余額 其實這個章節的一些知識點在轉賬交易那一章節均有所涉及,所以,查詢余額這個功能相對而言比較簡單,只要熟悉了UTXO模型,加上對交易流程的了解之後,對查詢余額基本上已經有了思路。 1.
從0到1簡易區塊鏈開發手冊V0.4-實現轉賬交易的思路分析
序列 場景 tran color value lastb ali 區塊 創建 六.轉賬交易 創世區塊創建完畢之後,按照我們的正常思路,是繼續創建新的區塊,並加入至區塊鏈中,沒錯,這確實是學習路線,但是我們首先來了解一個區塊是如何生成的,轉賬交易 ===>打包交易 =
從0到1簡易區塊鏈開發手冊V0.6-實現打印區塊
操作 error 8 8 size ima 鎖定 圖片 src 。。 八. 打印區塊 以上的轉賬交易中,我們共計創建了四個區塊,其中一個區塊為創世區塊,另外三個區塊都是對我們的交易進行打包後產生的新區塊,本文將介紹如何將區塊信息打印出來。 1.命令行代碼 func (cli
兄弟連區塊鏈入門教程分享區塊鏈POW證明代碼實現demo
fault dem val == 否則 缺點 ESS lang pos 這裏強調一下區塊鏈的協議分層?應用層?合約層?激勵機制?共識層?網絡層?數據層上 一篇主要實現了區塊鏈的 數據層,數據層主要使用的技術就是對數據的校驗,求hash。這裏介紹工作量證明POW, POW是屬
淺談網路爬蟲中深度優先演算法和簡單程式碼實現
學過網站設計的小夥伴們都知道網站通常都是分層進行設計的,最上層的是頂級域名,之後是子域名,子域名下又有子域名等等,同時,每個子域名可能還會擁有多個同級域名,而且URL之間可能還有相互連結,千姿百態,由此構成一個複雜的網路。 當一個網站的URL非常多的時候,我們務必要設計好URL,否則在後期的理解
區塊鏈遊戲和吃雞、王者榮耀等相比到底有什麽優勢?
優勢 區別 com 特性 ado 最重要的 ges 和數 目前 現如今遊戲市場上各式各樣的區塊鏈遊戲,各家公司紛紛的發布自家的區塊鏈遊戲產品,許多傳統遊戲玩家也紛紛將目光投進區塊鏈遊戲行業上。讓傳統遊戲廠商不得不感嘆2019年將是區塊鏈遊戲風暴的到來。 我認為一款
經典整合學習演算法和部分python實現
Boosting Boosting的大概思想是先從初始訓練集中訓練出一個基學習器,再根據這個基學習器對訓練集的判斷重新調整訓練集,讓當前分類器判斷錯誤的樣本在後續學習中受到更高的關注,如此不斷迭代,直到生成目標數目的基學習器,然後根據權重相加,獲得一個強學習器
切不要誤導輿論,把區塊鏈技術和比特幣混為一談
前段時間,加密貨幣的幣價下跌到歷史最低點,隨著比特幣價格的大起大落,比特幣交易平臺的腥風血雨,一些不太瞭解區塊鏈技術和比特幣的投資者和韭菜們,開始將區塊鏈技術與比特幣混為一談。位元之窗數字貨幣資訊平臺,為數字貨幣愛好者提供安全,最新的資訊平臺 區塊鏈技術是分
批量梯度下降演算法的簡單Python實現
演算法理論 為了實現監督學習,假設對於因變數y有自變數x1x2,則有y=θ1x1+θ2x2+θ0 θ0是偏移量,令θ0=1,得到: 我們再定義誤差函式j(θ)(係數為1/2是用來消去後面的2)來表示h(x)與y的接近程度: 目的是使誤差函式最小,需要求得使誤差函式最小