Pythonを使用して独自の暗号通貨を作成する方法

現在の暗号通貨の台頭により、ブロックチェーンはテクノロジーの世界で話題を呼んでいます。このテクノロジーは、主にセキュリティを保証し、分散化を実施し、いくつかの業界、特に金融業界へのプロセスを迅速化する能力のために、非常に注目を集めています。

基本的に、ブロックチェーンは、デジタル資産の所有と送信を不可逆的に文書化および認証するパブリックデータベースです。ビットコインやイーサリアムなどのデジタル通貨は、この概念に基づいています。ブロックチェーンは、アプリケーションの機能を変革するために使用できるエキサイティングなテクノロジーです。

最近では、政府、組織、個人がブロックチェーンテクノロジーを使用して独自の暗号通貨を作成し、取り残されないようにしています。特に、FacebookがLibraと呼ばれる独自の暗号通貨を提案したとき、その発表は世界中の多くの水域を刺激しました。

あなたもそれに倣い、独自のバージョンの暗号通貨を作成できるとしたらどうでしょうか?

私はこれについて考え、暗号を作成するアルゴリズムを開発することにしました。

私は暗号通貨をfccCoinと呼ぶことにしました

このチュートリアルでは、デジタル通貨を構築するために使用したステップバイステップのプロセスを説明します(Pythonプログラミング言語のオブジェクト指向の概念を使用しました)。

fccCoinを作成するためのブロックチェーンアルゴリズムの基本的な青写真は次のとおりです。

class Block: def __init__(): #first block class pass def calculate_hash(): #calculates the cryptographic hash of every block class BlockChain: def __init__(self): # constructor method pass def construct_genesis(self): # constructs the initial block pass def construct_block(self, proof_no, prev_hash): # constructs a new block and adds it to the chain pass @staticmethod def check_validity(): # checks whether the blockchain is valid pass def new_data(self, sender, recipient, quantity): # adds a new transaction to the data of the transactions pass @staticmethod def construct_proof_of_work(prev_proof): # protects the blockchain from attack pass @property def last_block(self): # returns the last block in the chain return self.chain[-1] 

さて、何が起こっているのか説明させてください…

1.最初のブロッククラスを構築する

ブロックチェーンは、互いに結合されたいくつかのブロックで構成されています(おなじみのようですね)。

ブロックのチェーンは、1つのブロックが改ざんされた場合に、チェーンの残りの部分が無効になるように行われます。

上記の概念を適用する際に、次の初期ブロッククラスを作成しました。

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) 

上記のコードからわかるように、他のPythonクラスと同様に、Blockクラスが開始されるときに実行される__init __()関数を定義しました。

開始関数に次のパラメーターを指定しました。

  • self —これはBlockクラスのインスタンスを参照し、クラスに関連付けられたメソッドと属性にアクセスできるようにします。
  • index —これはブロックチェーン内のブロックの位置を追跡します。
  • proof_no —これは、新しいブロック(マイニングと呼ばれる)の作成中に生成される番号です。
  • prev_hash —これはチェーン内の前のブロックのハッシュを参照します。
  • データ-これは、購入した数量など、完了したすべてのトランザクションの記録を提供します。
  • タイムスタンプ-トランザクションのタイムスタンプを配置します。

クラスの2番目のメソッドcalculate_hashは、上記の値を使用してブロックのハッシュを生成します。SHA-256モジュールがプロジェクトにインポートされ、ブロックのハッシュの取得を支援します。

値が暗号化ハッシュアルゴリズムに入力された後、関数はブロックの内容を表す256ビットの文字列を返します。

これは、ブロックチェーンでセキュリティが実現される方法です。すべてのブロックにハッシュがあり、そのハッシュは前のブロックのハッシュに依存します。

そのため、誰かがチェーン内のいずれかのブロックを侵害しようとすると、他のブロックには無効なハッシュが含まれ、ブロックチェーンネットワーク全体が混乱します。

最終的に、ブロックは次のようになります。

{ "index": 2, "proof": 21, "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823", "transactions": [ {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1} ], "timestamp": 1521646442.4096143 } 

2.ブロックチェーンクラスの構築

ブロックチェーンの主なアイデアは、その名前が示すように、複数のブロックを相互に「チェーン」することです。

したがって、チェーン全体の動作を管理するのに役立つBlockchainクラスを構築します。これは、ほとんどのアクションが行われる場所です。

Blockchainのクラスはblockchainでさまざまなタスクを完了するための様々なヘルパーメソッドを持っています。

クラス内の各メソッドの役割について説明します。

a。コンストラクターメソッド

このメソッドは、ブロックチェーンがインスタンス化されることを保証します。

class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() 

その属性の役割は次のとおりです。

  • self.chain —この変数はすべてのブロックを保持します。
  • self.current_data —この変数は、完了したすべてのトランザクションをブロックに保持します。
  • self.construct_genesis() -このメソッドは、最初のブロックの構築を処理します。

b。ジェネシスブロックの構築

ブロックチェーンには、チェーンの最初のブロックを構築するためのconstruct_genesisメソッドが必要です。ブロックチェーンの慣例では、このブロックはブロックチェーンの開始を象徴するため、特別です。

In this case, let’s construct it by simply passing some default values to the construct_block method.

I gave both proof_no and prev_hash a value of zero, although you can provide any value you want.

def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block 

c. Constructing new blocks

The construct_blockmethod is used for creating new blocks in the blockchain.

Here is what is taking place with the various attributes of this method:

  • index—this represents the length of the blockchain;
  • proof_nor & prev_hash—the caller method passes them;
  • data—this contains a record of all the transactions that are not included in any block on the node;
  • self.current_data—this is used to reset the transaction list on the node. If a block has been constructed and the transactions allocated to it, the list is reset to ensure that future transactions are added into this list. And, this process will take place continuously;
  • self.chain.append()—this method joins newly constructed blocks to the chain;
  • return—lastly, a constructed block object is returned.

d. Checking validity

The check_validity method is important in assessing the integrity of the blockchain and ensuring anomalies are absent.

As mentioned earlier, hashes are essential for the security of the blockchain as even the slightest change in the object will lead to the generation of a completely new hash.

Therefore, this check_validitymethod uses if statements to check whether the hash of every block is correct.

It also verifies if every block points to the right previous block, through comparing the value of their hashes. If everything is correct, it returns true; otherwise, it returns false.

@staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True 

e. Adding data of transactions

The new_data method is used for adding the data of transactions to a block. It’s a very simple method: it accepts three parameters (sender’s details, receiver’s details, and quantity) and append the transaction data to self.current_data list.

Anytime a new block is created, this list is allocated to that block and reset once more as explained in the construct_block method.

Once the transaction data has been added to the list, the index of the next block to be created is returned.

This index is calculated by adding 1 to the index of the current block (which is the last in the blockchain). The data will assist a user in submitting the transaction in future.

def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True 

f. Adding proof of work

Proof of work is a concept that prevents the blockchain from abuse. Simply, its objective is to identify a number that solves a problem after a certain amount of computing work is done.

If the difficulty level of identifying the number is high, it discourages spamming and tampering with the blockchain.

In this case, we’ll use a simple algorithm that discourages people from mining blocks or creating blocks easily.

@staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" 

g. Getting the last block

Lastly, the latest_blockmethod is a helper method that assists in obtaining the last block in the blockchain. Remember that the last block is actually the current block in the chain.

@property def latest_block(self): return self.chain[-1] 

Let’s sum everything together

Here is the entire code for creating the fccCoin cryptocurrency.

You can also get the code on this GitHub repository.

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block @staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True @staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" @property def latest_block(self): return self.chain[-1] def block_mining(self, details_miner): self.new_data( sender="0", #it implies that this node has created a new block receiver=details_miner, quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_block = self.latest_block last_proof_no = last_block.proof_no proof_no = self.proof_of_work(last_proof_no) last_hash = last_block.calculate_hash block = self.construct_block(proof_no, last_hash) return vars(block) def create_node(self, address): self.nodes.add(address) return True @staticmethod def obtain_block_object(block_data): #obtains block object from the block data return Block( block_data['index'], block_data['proof_no'], block_data['prev_hash'], block_data['data'], timestamp=block_data['timestamp']) 

Now, let’s test our code to see if it works.

blockchain = BlockChain() print("***Mining fccCoin about to start***") print(blockchain.chain) last_block = blockchain.latest_block last_proof_no = last_block.proof_no proof_no = blockchain.proof_of_work(last_proof_no) blockchain.new_data( sender="0", #it implies that this node has created a new block recipient="Quincy Larson", #let's send Quincy some coins! quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_hash = last_block.calculate_hash block = blockchain.construct_block(proof_no, last_hash) print("***Mining fccCoin has been successful***") print(blockchain.chain) 

It worked!

Here is the output of the mining process:

***Mining fccCoin about to start*** [0 - 0 - 0 - [] - 1566930640.2707076] ***Mining fccCoin has been successful*** [0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243] 

Conclusion

There you have it!

That’s how you could create your own blockchain using Python.

Let me say that this tutorial just demonstrates the basic concepts for getting your feet wet in the innovative blockchain technology.

If this coin were deployed as-is, it could not meet the present market demands for a stable, secure, and easy-to-use cryptocurrency.

Therefore, it can still be improved by adding additional features to enhance its capabilities for mining and sending financial transactions.

Nonetheless, it’s a good starting point if you decide to make your name known in the amazing world of cryptos.

If you have any comments or questions, please post them below.

Happy (crypto) coding!