ホームページ バックエンド開発 Python チュートリアル Python の基礎入門 -- ブロックチェーン

Python の基礎入門 -- ブロックチェーン

Aug 13, 2017 pm 02:55 PM
python ブロック ベース

ブロックチェーンの基本概念はシンプルです。多くの順序付けされたレコードを含む増大するリストを保存する分散データベースです。次の記事では、Python を学習するためのブロックチェーンに関する情報を中心に、サンプルコードを通じて詳しく紹介しています。必要な方は以下をご覧ください。

はじめに

この記事では、ブロックチェーン (BlockChain) に関する関連知識と、Python を使用した簡単な実装について簡単に紹介します。これ以上の苦労はせずに、詳細な紹介を見てみましょう:

ブロックチェーンとは

簡単に言えば、ブロックチェーンは暗号化されたデータ (ブロック) を時系列に重ね合わせたもの (チェーン) 結果として得られる永続的で、不可逆的に変更された記録です。具体的には、ブロックチェーンは、暗号化手法を使用して生成された一連のデータ ブロックで構成されます。各ブロックには、ジェネシス ブロックから開始して、現在のブロックに接続してブロック チェーンを形成します。各ブロックは、時系列で前のブロックの後に生成されることが保証されています。そうでない場合、前のブロックのハッシュ値は不明です。ビットコインでは重要な概念です。

特徴

ブロックチェーンには次の特徴があります:

  • 分散化: ブロックチェーンは中央ノードに依存せず、分散ノードに依存します。

  • 信頼システムは不要: ブロックチェーンは暗号アルゴリズムに基づいており、データはネットワーク内の他のユーザーによって承認される必要があるため、サードパーティの仲介構造や信頼組織による承認は必要ありません。

  • 改ざん不可能な暗号化されたセキュリティ: ブロックチェーンは一方向ハッシュアルゴリズムを採用しており、新しく生成された各ブロックは厳密に線形順序で進みます。時間の不可逆性により、ブロックチェーン内のデータに侵入して改ざんする試みが行われます。情報の動作は簡単に追跡できるため、他のノードによる拒否につながり、関連する違法行為を制限できます。

上記の特性により、ブロックチェーンは銀行、証券市場、金融などの多くの分野でますます多くの応用が可能になります。

ブロックチェーンの仕組み

ブロックチェーンは、一連の暗号化されたデータブロックです。これらのブロックは、メタデータを含むブロック ヘッダーと、それに続くブロックの本体を構成するトランザクションの長いリストで構成されます。ビットコインのブロック構造は次のとおりです。

ブロック ヘッダー

ブロック ヘッダーには、次のように、ブロックチェーン内の他のブロックとの接続情報、タイムスタンプ、ノンス、その他の情報が含まれます。識別子

ブロックには 2 つの識別子があり、1 つはブロックヘッダーのハッシュ値、もう 1 つはブロックの高さです。ブロックヘッダのハッシュ値は、ブロックヘッダをSHA256アルゴリズムで2回ハッシュ化した数値です。ブロック ハッシュ値はブロックを一意かつ明確に識別し、どのノードもブロック ヘッダーをハッシュするだけでブロック ハッシュ値を独立して取得できます。ブロックの高さは、ブロックチェーン内のブロックの位置を指します。ブロックの高さは一意の識別子ではありません。単一のブロックは常に明確で固定されたブロックの高さを持ちますが、その逆は当てはまらず、ブロックの高さが必ずしも単一のブロックを識別するとは限りません。 2 つ以上のブロックが同じブロック高さを持ち、ブロックチェーン内の同じ位置をめぐって競合する場合があります。

上記の基本を理解したら、Python を使用して簡単なブロックチェーンを実装してみましょう。

ブロックチェーンのPython実装

1. ブロック構造を定義します[16]:

# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 产生唯一标示
  self.nonce = None     # nonce值
  self.data = data      # 区块内容
  self.previous_hash = previous_hash # 父节点哈希值
  
 def hash(self, nonce=None):
  '''
  计算区块的哈希值
  '''
  message = hashlib.sha256()
  message.update(self.identifier.encode('utf-8'))
  message.update(str(nonce).encode('utf-8'))
  message.update(str(self.data).encode('utf-8'))
  message.update(str(self.previous_hash).encode('utf-8'))

  return message.hexdigest()

 def hash_is_valid(self, the_hash):
  '''
  校验区块哈希值有否有效
  '''
  return the_hash.startswith('0000')

 def __repr__(self):
  return &#39;Block<Hash: {}, Nonce: {}>&#39;.format(self.hash(), self.nonce)
ログイン後にコピー

上記はブロック構造であり、ここで実装されているのは簡易版です。ビットコインのブロックに正確に対応するものはありません。ここでのブロックには、一意の識別子、親ノードのハッシュ値、ノンス値、およびブロックのコンテンツ フィールドが含まれます。ブロックのハッシュ値が有効であるためには、0000 で始まるなどの特定の条件を満たす必要があることがわかります。次に、このブロック構造を初期化します。

In [37]:

# 创建一个内容为hello world的内容块

block = Block(&#39;Hello World&#39;)
block
ログイン後にコピー
Out[37]:


Block<Hash: 238a65a101c8829d7fc406eb78a71cfc19ad702b437e2c1be8d9061ddb81e900, Nonce: None>
ログイン後にコピー
上記のブロックは作成されましたが、そのハッシュ値は有効ではありません。

In [38]:

block.hash_is_valid(block.hash())
ログイン後にコピー
Out[38]:


False
ログイン後にコピー
nonceの値を変更して新しいハッシュ値を取得します。

In[39]:

block.hash(1)
ログイン後にコピー
Out[39]:


&#39;a6431938ba10270dfcfdf7a2371312446914fedadf79632c2c0adb3b463f4838&#39;
ログイン後にコピー
ハッシュは更新されましたが、まだ有効なハッシュではありません。有効なハッシュ値を取得するには、ノンス値を継続的に更新する処理、つまりマイニング処理が必要です。以下の Mine 関数を追加して、適切な nonce 値を取得します。

In [78]:


# block.py

import hashlib
import uuid


class Block(object):
 def __init__(self, data=None, previous_hash=None):
  self.identifier = uuid.uuid4().hex # 产生唯一标示
  self.nonce = None     # nonce值
  self.data = data      # 区块内容
  self.previous_hash = previous_hash # 父节点哈希值
  
 def hash(self, nonce=None):
  &#39;&#39;&#39;
  计算区块的哈希值
  &#39;&#39;&#39;
  message = hashlib.sha256()
  message.update(self.identifier.encode(&#39;utf-8&#39;))
  message.update(str(nonce).encode(&#39;utf-8&#39;))
  message.update(str(self.data).encode(&#39;utf-8&#39;))
  message.update(str(self.previous_hash).encode(&#39;utf-8&#39;))

  return message.hexdigest()

 def hash_is_valid(self, the_hash):
  &#39;&#39;&#39;
  校验区块哈希值有否有效
  &#39;&#39;&#39;
  return the_hash.startswith(&#39;0000&#39;)

 def __repr__(self):
  return &#39;Block<Hash: {}, Nonce: {}>&#39;.format(self.hash(self.nonce), self.nonce)
 
 
 &#39;&#39;&#39;
  新增挖矿函数
 &#39;&#39;&#39;
 def mine(self):
  # 初始化nonce为0
  cur_nonce = self.nonce or 0

  # 循环直到生成一个有效的哈希值
  while True:
   the_hash = self.hash(nonce=cur_nonce)
   if self.hash_is_valid(the_hash): # 如果生成的哈希值有效
    self.nonce = cur_nonce   # 保持当前nonce值
    break       # 并退出
   else:
    cur_nonce += 1 # 若当前哈希值无效,更新nonce值,进行加1操作
ログイン後にコピー

In [75]:


block = Block(&#39;Hello World&#39;)

# 挖矿,循环直至找到合适的nonce
block.mine()

# 打印
block
ログイン後にコピー

Out[75]:


Block<Hash: 000087359d5264153d624556f0a0c6f25cba06e453975c1c02587862e823911b, Nonce: 64751>
ログイン後にコピー

至此,第一个有效的区块生成完成,下面开始定义区块链。

二、定义区块链结构

In [81]:


class BlockChain(object):
 def __init__(self):
  self.head = None # 指向最新的一个区块
  self.blocks = {} # 包含所有区块的一个字典

 &#39;&#39;&#39;
  添加区块函数
 &#39;&#39;&#39;
 def add_block(self, new_block):
  previous_hash = self.head.hash() if self.head else None
  new_block.previous_hash = previous_hash

  self.blocks[new_block.identifier] = {
   &#39;block&#39;: new_block,
   &#39;previous_hash&#39;: previous_hash,
   &#39;previous&#39;: self.head,
  }
  self.head = new_block

 def __repr__(self):
  num_existing_blocks = len(self.blocks)
  return &#39;Blockchain<{} Blocks, Head: {}>&#39;.format(
   num_existing_blocks,
   self.head.identifier if self.head else None
  )
ログイン後にコピー

定义好区块链结构后,下面就开始初始化一条区块链。

In [82]:


# 初始化
chain = BlockChain()

# 打印
chain
ログイン後にコピー

Out[82]:


Blockchain<0 Blocks, Head: None>
ログイン後にコピー

In [83]:


# 添加区块
chain.add_block(block)

# 打印
chain
ログイン後にコピー

Out[83]:


Blockchain<1 Blocks, Head: 364c0cf963384ca28a2763499a140405>
ログイン後にコピー

In [84]:


# 添加更多的区块

for i in range(6):
 new_block = Block(i)
 new_block.mine()
 chain.add_block(new_block)
 
# 打印
chain
ログイン後にコピー

Out[84]:


Blockchain<7 Blocks, Head: e7cb24ec7acd42a4aaebe7faee9e0713>
ログイン後にコピー

以上就是一个简单区块链,后面还会涉及到区块链的有效性。当区块链中一个区块被改变后,这个区块的哈希就会改变,从而影响到这块区块之后的区块,致使这个区块链不再有效。这些将在后续继续深入。

以上がPython の基礎入門 -- ブロックチェーンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mysqlは支払う必要がありますか mysqlは支払う必要がありますか Apr 08, 2025 pm 05:36 PM

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

hadidb:pythonの軽量で水平方向にスケーラブルなデータベース hadidb:pythonの軽量で水平方向にスケーラブルなデータベース Apr 08, 2025 pm 06:12 PM

hadidb:軽量で高レベルのスケーラブルなPythonデータベースHadIDB(HadIDB)は、Pythonで記述された軽量データベースで、スケーラビリティが高くなっています。 PIPインストールを使用してHADIDBをインストールする:PIPINSTALLHADIDBユーザー管理CREATEユーザー:CREATEUSER()メソッド新しいユーザーを作成します。 Authentication()メソッドは、ユーザーのIDを認証します。 fromhadidb.operationimportuseruser_obj = user( "admin"、 "admin")user_obj。

MongoDBデータベースパスワードを表示するNAVICATの方法 MongoDBデータベースパスワードを表示するNAVICATの方法 Apr 08, 2025 pm 09:39 PM

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

mysqlはインターネットが必要ですか? mysqlはインターネットが必要ですか? Apr 08, 2025 pm 02:18 PM

MySQLは、基本的なデータストレージと管理のためにネットワーク接続なしで実行できます。ただし、他のシステムとのやり取り、リモートアクセス、または複製やクラスタリングなどの高度な機能を使用するには、ネットワーク接続が必要です。さらに、セキュリティ対策(ファイアウォールなど)、パフォーマンスの最適化(適切なネットワーク接続を選択)、およびデータバックアップは、インターネットに接続するために重要です。

MySQLワークベンチはMariadBに接続できますか MySQLワークベンチはMariadBに接続できますか Apr 08, 2025 pm 02:33 PM

MySQLワークベンチは、構成が正しい場合、MariadBに接続できます。最初にコネクタタイプとして「mariadb」を選択します。接続構成では、ホスト、ポート、ユーザー、パスワード、およびデータベースを正しく設定します。接続をテストするときは、ユーザー名とパスワードが正しいかどうか、ポート番号が正しいかどうか、ファイアウォールが接続を許可するかどうか、データベースが存在するかどうか、MariadBサービスが開始されていることを確認してください。高度な使用法では、接続プーリングテクノロジーを使用してパフォーマンスを最適化します。一般的なエラーには、不十分な権限、ネットワーク接続の問題などが含まれます。エラーをデバッグするときは、エラー情報を慎重に分析し、デバッグツールを使用します。ネットワーク構成を最適化すると、パフォーマンスが向上する可能性があります

高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? 高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? Apr 08, 2025 pm 06:03 PM

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

MySQLを解く方法は、ローカルホストに接続できません MySQLを解く方法は、ローカルホストに接続できません Apr 08, 2025 pm 02:24 PM

MySQL接続は、次の理由が原因である可能性があります。MySQLサービスは開始されず、ファイアウォールは接続をインターセプトし、ポート番号が間違っています。ユーザー名またはパスワードが間違っています。My.cnfのリスニングアドレスは不適切に構成されています。トラブルシューティング手順には以下が含まれます。 2.ファイアウォール設定を調整して、MySQLがポート3306をリッスンできるようにします。 3.ポート番号が実際のポート番号と一致していることを確認します。 4.ユーザー名とパスワードが正しいかどうかを確認します。 5. my.cnfのバインドアドレス設定が正しいことを確認してください。

Amazon AthenaでAWS接着クローラーの使用方法 Amazon AthenaでAWS接着クローラーの使用方法 Apr 09, 2025 pm 03:09 PM

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。

See all articles