ブロックチェーンコーディング:必要な多くの異なる言語!

このガイドでは、より主要なブロックチェーンコーディングのいくつかについて説明します。また、始めたばかりの場合は、包括的なブロックチェーンコースをご覧ください。.

ブロックチェーンテクノロジーは非常に魅力的です。完全にその上に構築される未来を考えることは、大したことではありません。では、ブロックチェーンでの開発を開始するには、何を学ぶ必要がありますか?どの言語があなたに優位性を与えますか?ブロックチェーンコーディングを始めましょう!

Contents

ブロックチェーン問題のプログラミング

始める前に、ブロックチェーン開発者が直面するいくつかの課題を確認しましょう。パブリックブロックチェーンの作成と維持は、いくつかの理由から簡単ではありません.

(続行する前に、CPPCON2016のブロックチェーンソフトウェア開発でのC ++の使用に関する基調講演についてDavidSchwartzに大声で叫びました。)

ブロックチェーンコーディング

ブロックチェーンコーディングの難しさの課題#1:セキュリティ

ブロックチェーン、 デビッドシュワルツ それを置く、要塞でなければなりません。まず、コードは公開されており、誰でも見ることができます。誰でもコードを調べて、バグや脆弱性をチェックできます。ただし、他のオープンコードリソースとは異なり、ブロックチェーンコードの脆弱性を見つけることの欠点は非常に大きいです。プログラマーなら誰でもハッキングして、潜在的に数百万ドルから逃げ出すことができます。これらの正当なセキュリティ上の懸念のため、ブロックチェーンでの開発は通常非常に遅いです.

ブロックチェーンコーディングの難しさの課題#2:リソース管理

ネットワークと歩調を合わせることが重要です。遅れすぎて、すべてのネットワーク要求に追いついていないことはできません。リモートおよびローカルのクエリを処理するための十分な準備が整っている必要があります.

ブロックチェーンコーディングの難しさの課題#3:パフォーマンス

ブロックチェーンは常に可能な限り最高の機能で実行する必要がありますが、そのためには、選択した言語が非常に用途が広い必要があります。重要なのは、ブロックチェーンには並列化可能な特定のタスクがあり、並列に実行できないタスクもあるということです。.

「並列化可能な」タスクの良い例は、デジタル署名の検証です。署名の検証に必要なのは、キー、トランザクション、および署名だけです。わずか3つのデータで、並列化された方法で検証を実行できます.

ただし、ブロックチェーン上のすべての機能をそのように実行する必要はありません。トランザクションの実行自体を考えてください。複数のトランザクションを並行して実行することはできません。二重支払いなどのエラーを回避するために、一度に1つずつ実行する必要があります。一部の言語は並列操作に優れていますが、一部の言語は非並列操作に優れています.

ブロックチェーン開発者になるためのトレーニング

今日から無料トライアルを始めましょう!

ブロックチェーンコーディングの難しさの課題#4:分離

決定論的行動とは?

  • A + B = Cの場合、どのような状況であっても、A + Bは常にCに等しくなります。これは決定論的動作と呼ばれます。.
  • ハッシュ関数は決定論的です。つまり、Aのハッシュは常にH(A)になります。.

したがって、ブロックチェーン開発では、すべてのトランザクション操作が決定論的である必要があります。ある方法で動作し、翌日に別の方法で動作するトランザクションを持つことはできません。同様に、2つの異なるマシンで2つの異なる方法で機能するスマートコントラクトを持つことはできません.

これに対する唯一の解決策は分離です。基本的に、スマートコントラクトとトランザクションを非決定論的要素から分離します.

そこで、ブロックチェーン開発者が直面する主な問題について説明しました。最後に、開発者がブロックチェーンでコーディングするために使用できるいくつかの言語を確認しましょう。.

ブロックチェーンコーディング言語#1:C++

まず第一に、それらすべての祖父、 エバーグリーンC++. C ++は、C言語の拡張としてBjarneStroustrupによって作成されました。この言語は、Cの柔軟性と効率性を備えて設計されていますが、いくつかの大きな違いがあります。 CとC ++の最大の違いは、Cはプロセス指向であるのに対し、C ++はオブジェクト指向であるということです。.

これは、C ++では、データと関数が「オブジェクト」と呼ばれる1つの小さなパッケージにラップされていることを意味します。つまり、オブジェクトを作成すると、他のプログラムで簡単に呼び出して再利用できるため、コーディング時間が大幅に短縮されます。.

世界で最も単純なC ++プログラムを見てみましょう。 「HelloWorld」プログラム:

#include

メイン()

{{

カウト << "こんにちは世界!";

0を返します。

}

このコードは「HelloWorld!」を出力します。

では、なぜ人々はまだコーディングにC ++を使用しているのでしょうか。確かに今はもっと魅力的な言語がありますが、なぜ人々はまだC ++に戻ることを主張するのですか?ビットコインブロックチェーンがCでコーディングされているのはなぜですか++?

たまたま、C ++には非常に魅力的な機能があります。 (次の説明については、PeterWiulleとDavidSchwartzを叫んでください).

機能#1:メモリ制御

ブロックチェーン開発の課題について前に言ったことを覚えていますか?ブロックチェーンは安全な要塞であるだけでなく、効果的なリソース管理も必要です。ブロックチェーンは、信頼できない多くのエンドポイントと相互作用する一方で、すべてのノードに迅速なサービスを提供することになっています.

この迅速で迅速なサービスは、ビットコインのような暗号通貨の成功にとって重要です。これらはすべて「コンセンサス」の原則に基づいていることを忘れないでください。ネットワーク上のすべてのノードは、まったく同じブロックを受け入れて拒否する必要があります。そうしないと、チェーンにフォークが存在する可能性があります。.

これらすべての要求を満たし、最高レベルで実行するには、CPUとメモリの使用量を厳密かつ完全に制御する必要があります。 C ++はそれをユーザーに提供します.

機能#2:スレッド化

前に説明したように、ブロックチェーンプログラミングの主な課題の1つは、並列化が適切なタスクと並列化されないタスクの統合です。ほとんどの言語は1つに特化していますが、C ++のスレッド機能は、並列タスクと非並列タスクの両方を処理するのに十分です。スレッドは、同時に実行できる一連の命令です。 C ++は、効果的なスレッド間通信を備えた優れたマルチスレッド機能を可能にするだけでなく、シングルスレッドのパフォーマンスも最適化します。.

機能#3:移動セマンティクス

C ++の最も興味深い側面の1つは、移動セマンティクスです。移動セマンティクスは、コンテンツを完全にコピーするのではなく、オブジェクト間で移動する方法を提供します。コピーセマンティクスと移動セマンティクスの違いを確認しましょう。 (以下のデータは、「Stackoverflow」のPeter Alexanderの回答から取得されています).

コピーセマンティクス:

  • assert(b == c);
  • a = b;
  • assert(a == b && b == c);

では、ここで何が起こっているのでしょうか。 bの値はaに入り、bは全体の終わりに変更されません。.

今、これを考慮してください.

移動セマンティクス:

  • assert(b = = c);
  • 移動(a、b);
  • アサート(a = = c);

ここで何が起きてるの?

2つのコードブロックの違いがわかりますか?

移動セマンティクスを使用する場合、「b」の値を変更する必要はありません。これが、コピーセマンティクスと移動セマンティクスの違いです。移動セマンティクスの最大の利点は、特定のデータのコピーを必要なときにのみ取得できることです。これにより、コードの冗長性が大幅に低下し、パフォーマンスが大幅に向上します。ご覧のとおり、この効率的なメモリ管理と高性能の両方がブロックチェーンにとって望ましいものです。.

機能#4:コンパイル時のポリモーフィズム

ポリモーフィズムとは?

C ++を「オブジェクト指向プログラミング(OOP)言語」と呼んだことを覚えていますか?ポリモーフィズムはたまたまOOPプロパティです。ポリモーフィズムを使用すると、特定の機能を複数の方法で使用します。 C ++では、ポリモーフィズムは2つの方法で使用できます。

  • コンパイル時のポリモーフィズム.
  • 実行時のポリモーフィズム.

ここでは、コンパイル時のポリモーフィズムのみに焦点を当てます。 C ++がコンパイル時のポリモーフィズムを実装する方法は2つあります。

  • 関数のオーバーロード.
  • 演算子のオーバーロード.

関数のオーバーロード:

関数のオーバーロードとは、同じ名前でパラメーターの取り込みが異なる関数が多数ある場合です。.

このプログラムを検討してください:

#include

名前空間stdを使用します。

クラスA

{{

void func(int x)//関数の最初のインスタンスは1つの整数値のみを取ります

{{

カウト<<バツ<<endl;

}

void func(double x)//関数の2番目のインスタンスは1つのdouble値のみを取ります

{{

カウト<<バツ<<endl;

}

void func(int x、int y)//関数の3番目のインスタンスは2つの整数値を取ります

{{

カウト<<x = y<<endl;

}

}

int main()

{{

obj1 //クラスAの1つのオブジェクトを作成する

//次に関数を呼び出します

obj1.func(2);

obj1.func(2.65);

obj1.func(2,5);

0を返します。

}

この関数を実行すると、出力は次のようになります。

  • 2
  • 2.65
  • 7

ご覧のとおり、同じ関数func()が3つの異なる方法で使用されました.

演算子のオーバーロード:

C ++では、同じ演算子に複数の意味を持たせることができます.

  • 例えば。 「+」は、数学的な加算と連結の両方に使用できます.
  • 連結とは、基本的に2つの文字列を取り、それらを1つに結合することを意味します.
  • したがって、3 + 4 = 7.

そして

  • ブロック+オタク=ブロックオタク.
  • 同じ演算子が2つの異なる機能を実行しました。これは演算子のオーバーロードです.

コンパイル時のポリモーフィズムは、ブロックチェーンの開発に大いに役立ちます。これは、さまざまな機能に個別に責任を負わせるのに役立ち、ひいてはシステム全体のパフォーマンスを向上させます。.

機能#5:コードの分離

C ++には、あるプログラムから別のプログラムにインポートできる名前空間機能があります。名前空間は、名前の衝突を回避するのに役立ちます。また、C ++にはクラスがあるため、さまざまなAPI間の境界として機能し、明確な分離を行うのに役立ちます。.

C ++のクラスは、データと関数をメンバーとして持つキーワードクラスで宣言されたユーザー定義の型またはデータ構造です。その特定のクラスのオブジェクトを宣言することにより、クラスで宣言された関数にアクセスできます。.

機能#6:成熟度

言語は成熟しており、定期的に更新されています。 David Schwartzが言うように、少なくとも3つの堅実なコンパイラがあり、新しい機能は実際の問題を解決することを目的としています。パフォーマンスプロファイリングからあらゆる種類の問題の自動検出まで、あらゆる種類のデバッガーと分析ツールを利用できます。これは、言語が絶えず成長し、より新しくより良い機能を組み込むことを意味します.

上記の機能により、中本聡はビットコインソースコードのベース言語としてC ++を選択しました.

ブロックチェーンコーディング言語#2:Javascript

次はJavascriptです.

HTMLやCSSとともに、ワールドワイドウェブコンテンツ制作の3つのコアテクノロジーの1つです。 Javascriptは通常、高度にインタラクティブなWebページを作成するために使用されます。そこで、Javascriptを使用して非常に単純なブロックチェーンを作成する方法を見ていきます。このセクションの内容については、savjee.beに大声で叫ぶ.

Javascriptで単純なブロックチェーンを作成したいとします。そうする前に、対処する必要がある特定のことがあります.

ブロックチェーンとは何ですか?それはどのように正確に機能しますか…コードに関して?

ブロックチェーンは基本的に、データを含むブロックのチェーンです。それは基本的に栄光のリンクリストです。しかし、何がそんなに特別なのですか?ブロックチェーンは不変です。つまり、データがブロック内に入ると、それを変更することはできません。ブロックチェーンはどのようにして不変性を実現しますか?これは、「ハッシュ」と呼ばれる単純だが独創的なメカニズムによるものです。下の図を確認してください。

ブロックチェーンコーディング:必要な多くの異なる言語!

画像提供:LauriHartikka中程度の記事

各ブロックは、前のブロックのハッシュを含むハッシュポインタを介して前のブロックに接続されます。では、これはどのようにしてチェーンを不変にするのでしょうか?

暗号化ハッシュ関数の最も魅力的な特性の1つは、入力を少しでも変更すると、出力ハッシュに大きな影響を与える可能性があることです。例えば。これをチェックしてください:

ブロックチェーンコーディング:必要な多くの異なる言語!

最初の「T」を大文字から小文字に変更するだけで、出力ハッシュが大幅に変更されました.

だから、これはブロックチェーンにどのように影響しますか?

各ブロックは、ハッシュポインタを介して前のブロックに接続されます。したがって、誰かがブロック内のデータを改ざんすると、ハッシュが大幅に変更され、その結果、チェーン全体に影響を与えることになります(すべてのブロックがリンクされているため)。これは不可能なチェーンをフリーズさせるため、ブロックは変更されません。.

では、どのようにブロックを作成しますか?単純なブロックは何で構成されていますか?これから作成する単純なクリプトコイン(「BlockGeeksCoin」と呼びましょう)では、各ブロックに次の情報が含まれます。

  • インデックス:ブロック番号を知るため.
  • タイムスタンプ:作成時間を知るため.
  • データ:ブロック内のデータ.
  • 前のハッシュ:前のブロックのハッシュ.
  • ハッシュ:現在のブロックのハッシュ.

続行する前に。プログラムで使用する特定の用語を理解する必要があります。

  • この:「this」キーワードは関数内で呼び出され、特定の関数を呼び出す特定のオブジェクト内の値にアクセスできるようにします.
  • コンストラクタ:コンストラクターは、クラス内のオブジェクトの作成と初期化に役立つ特別な関数です。各クラスは1つのコンストラクターのみに制限されています.

これで、ブロックの作成を開始しましょう.

ブロックの作成

const SHA256 = require("crypto-js / sha256");

クラスブロック

{{

コンストラクター(インデックス、タイムスタンプ、データ、previousHash = ”)

{{

this.index =インデックス;

this.previousHash = previousHash;

this.timestamp =タイムスタンプ;

this.data = data;

this.hash = this.calculateHash();

}

computeHash()

{{

SHA256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data))。toString();を返します。

}

}

コード分​​析

さて、これはブロック外です。したがって、コードの最初の行では、sha256ハッシュ関数がJavaScriptで使用できないため、crypto-jsライブラリを呼び出しました。.

次に、クラス内でコンストラクターを呼び出して、特定の値を持つオブジェクトを呼び出しました。おそらくあなたの目を引くのはcalculateHash()関数です。それが正確に何をしているのか見てみましょう.

ブロックでは、すべてのコンテンツを取得してハッシュし、その特定のブロックのハッシュを取得します。 JSON.stringify関数を使用して、ブロックのデータを文字列に変換してハッシュします.

さて、ブロックの準備が整いました。それでは、ブロックをブロックチェーンに接続しましょう.

ブロックチェーンの作成

クラスBlockchain

{{

//セクション1ジェネシスブロックの作成

コンストラクタ()

{{

this.chain = [this.createGenesisBlock()];

}

createGenesisBlock()

{{

新しいBlock(0を返す, "2017年1月1日", "ジェネシスブロック", "0");

}

//セクション2新しいブロックの追加

getLatestBlock()

{{

this.chain [this.chain.length-1]を返します。

}

addBlock(newBlock){

newBlock.previousHash = this.getLatestBlock()。hash;

newBlock.hash = newBlock.calculateHash();

this.chain.push(newBlock);

}

//セクション3チェーンの検証

isChainValid()

{{

for(let i = 1; i < this.chain.length; i ++)

{{

const currentBlock = this.chain [i];

const previousBlock = this.chain [i-1];

if(currentBlock.hash!== currentBlock.calculateHash()){

falseを返します。

}

if(currentBlock.previousHash!== previousBlock.hash)

{{

falseを返します。

}

}

trueを返します。

}

}

コード分​​析

さて、上のチェーンでは多くのことが起こっているので、セクションに分けてみましょう.

セクション1:ジェネシスブロック

ジェネシスブロックとは?

ジェネシスブロックはブロックチェーンの最初のブロックであり、それが特別である理由は、すべてのボックがその前のブロックを指しているのに対し、ジェネシスブロックは何も指していないためです。したがって、新しいチェーンが作成されるとすぐに、ジェネシスブロックが呼び出されます。また、ブロックのデータを手動で指定した「createGenesisBlock()」関数を確認できます。

createGenesisBlock()

{{

新しいBlock(0、“ 01/01/2017”、“ Genesis block”、“ 0”);を返します。

}

ジェネシスブロックを構築したので、残りのチェーンを構築しましょう.

セクション2:ブロックの追加

まず、ブロックチェーンの最後のブロックが現在何であるかを知る必要があります。そのために、getLatestBlock()関数を使用します.

getLatestBlock()

{{

this.chain [this.chain.length-1]を返します。

}

最新のブロックを決定したので、新しいブロックを追加する方法を見てみましょう.

addBlock(newBlock){

newBlock.previousHash = this.getLatestBlock()。hash;

newBlock.hash = newBlock.calculateHash();

this.chain.push(newBlock);

}

それで、ここで何が起こっているのですか?ブロックをどのように追加しますか?指定されたブロックが有効かどうかをどのように確認しますか?

ブロックの内容を覚えておいてください?

ブロックには前のブロックのハッシュがあります?

したがって、ここで行うことは簡単です。新しいブロックのpreviousHash値を最新のブロックのハッシュ値と比較します.

ブロックチェーンコーディング:必要な多くの異なる言語!

画像提供:LauriHartikka中程度の記事

これらの2つの値が一致する場合、これは新しいブロックが正当であり、ブロックチェーンに追加されることを意味します.

セクション3:チェーンの検証

今、私たちは誰も私たちのブロックチェーンをいじっていないこと、そしてすべてが安定していることを確認する必要があります.

「for」ループを使用して、ブロック1から最後のブロックに移動します。ジェネシスブロックはブロック0です.

for(let i = 1; i < this.chain.length; i ++)

{{

const currentBlock = this.chain [i];

const previousBlock = this.chain [i-1];

コードのこの部分では、現在のブロックと前のブロックの2つの用語を定義しています。そして今、私たちはこれら2つの値のハッシュを見つけるだけです.

if(currentBlock.hash!== currentBlock.calculateHash()){

falseを返します。

}

if(currentBlock.previousHash!== previousBlock.hash)

{{

falseを返します。

}

}

trueを返します。

}

現在のブロックの「previousHash」が前のブロックの「Hash」と等しくない場合、この関数はFalseを返し、そうでない場合はTrueを返します。.

ブロックチェーンの使用

さて、ついにブロックチェーンを使用してBlockGeeksCoinを作成します.

  • BlockGeeksCoin = new Blockchain();
  • BlockGeeksCoin.addBlock(new Block(1、“ 20/07/2017”、{amount:4}));
  • BlockGeeksCoin.addBlock(new Block(2、“ 20/07/2017”、{amount:8}));

以上です!

だからここで何が起こったのか?

ブロックチェーンに基づいて新しい暗号通貨を作成し、BlockGeeksCoinという名前を付けました。この新しいオブジェクトを呼び出すことで、コンストラクターをアクティブにしました。コンストラクターは、Genesisブロックを自動的に作成しました。.

さらに2つのブロックを追加して、データを提供しました。.

とても簡単です.

(驚くほど簡単な説明をありがとうsavjee.be。)

ブロックチェーンコーディング言語#3:Python

オランダのプログラマーであるGuidovan Rossumは、1991年にPythonを作成しました。Pythonは、シンプルさとミニマリズムという単純な哲学に基づいています。彼らが言語にシンプルさを取り入れた最も注目すべき方法の1つは、中括弧やキーワードの代わりに空白を使用してコードブロックを示すことです。これが何を意味するのか見てみましょう.

簡単な「HelloWorld」プログラムをチェックしてみましょう.

print( ‘Hello、world!’)

うん、それだけだ!

それをC ++の「helloworld」プログラムと比較してください.

比較してどれほど複雑でないか見てみましょう。もう少し複雑なことをしてみませんか? 2つの数値を加算して、結果を出力するとします。.

num1 = 1.5

num2 = 6.3

合計= float(num1)+ float(num2)

print( ‘{0}と{1}の合計は{2}です’ .format(num1、num2、sum))

以上です.

このプログラムの出力は次のようになります。

  • 1.5と6.3の合計は7.8です

それでは、アンティを上げましょう。 Pythonを使用してブロックチェーン全体をどのようにプログラムしますか?次のデータとコードは、MediumのGeraldNashの記事から抜粋したものです。.

ブロックの作成

まず、ブロックを作成しましょう。

hashlibをhasherとしてインポートします

クラスブロック:

def __init __(self、index、timestamp、data、previous_hash):

self.index =インデックス

self.timestamp =タイムスタンプ

self.data = data

self.previous_hash = previous_hash

self.hash = self.hash_block()

def hash_block(self):

sha = hasher.sha256()

sha.update(str(self.index) +

str(self.timestamp) +

str(self.data) +

str(self.previous_hash))

sha.hexdigest()を返す

コード分​​析

まず、ハッシュライブラリをインポートしてSHA 256ハッシュ関数を使用します(Javascriptとまったく同じです)。.

前と同じように、ブロックの値は同じです。

  • インデックス.
  • タイムスタンプ.
  • データ.
  • 前のハッシュ.
  • ハッシュ.

反対に、以前と同じように、関数を介してハッシュ値を入力します.

ジェネシスブロックの作成

それでは、Genesisブロックを作成しましょう。

日付を日付としてインポート

def create_genesis_block():

戻り値Block(0、date.datetime.now()、“ Genesis Block”、“ 0”)

コード分​​析

タイムスタンプを入力するために日時をインポートしました.

ジェネシスブロックを生成し、手動で処理するデータを指定しました。前のハッシュ値は他のブロックを指していないため「0」です.

残りのブロックを作成する

次に、後続のブロックがどのように作成されるかを定義しましょう.

def next_block(last_block):

this_index = last_block.index + 1

this_timestamp = date.datetime.now()

this_data = "ねえ!私はブロックです " + str(this_index)

this_hash = last_block.hash

ブロックを返す(this_index、this_timestamp、this_data、this_hash)

コード分​​析

では、どのようにして、すべてのブロック内のすべてのデータの値を決定するのでしょうか。?

ブロックインデックスは、単に最後のブロックのインデックス+1です。.

タイムスタンプは現在の日付と時刻です.

ブロックのデータは単純なメッセージです。私はブロックしています」.

以前に定義した関数を使用して計算しているハッシュ.

そして最終的には、これらすべての値をブロックに返します.

ブロックチェーンの作成

最後に、ブロックチェーンを作成しましょう.

blockchain = [create_genesis_block()]

previous_block = blockchain [0]

num_of_blocks_to_add = 15

range(0、num_of_blocks_to_add)のiの場合:

block_to_add = next_block(previous_block)

blockchain.append(block_to_add)

previous_block = block_to_add

#みんなに教えて!

印刷 "ブロック#{}がブロックチェーンに追加されました!".format(block_to_add.index)

印刷 "ハッシュ:{} n".format(block_to_add.hash)

コード分​​析

まず、ジェネシスブロックを作成し、その値を「previous_block」に渡します。.

次に、追加するブロックの数を決定します。この例では、15を使用します。.

そのため、15まで実行し、すべてのブロックをブロックチェーンに追加するループを実行しています。ルックの最後に、インデックス番号を表示して、ブロックチェーンに追加された番号ブロックを印刷しています。さらに、ハッシュも印刷しています.

出力は次のようになります。

ブロックチェーンコーディング:必要な多くの異なる言語!

画像提供:Gerald Nash Medium Article

明らかに、これとjavascriptの両方で、Proof OfWorkのようなより複雑な機能を追加できます。それを実装する方法を学びたい場合は、GeraldNashの記事を読むことを強くお勧めします。しかし今のところ、少なくともPythonで簡単なブロックチェーンを作成する方法を知っています.

言語#4:堅実さ

最後に、Solidityに行きます。 DAPP(分散型アプリケーション)の作成方法やICOゲームに参加する方法を学びたい人にとって、Solidityを学ぶことは絶対に必要です。すでに詳細なガイドがあり、ここで読むことができます。ただし、ここでは基本的な概要を説明します。 Solidityは、Gavin Wood、Christian Reitwiessner、Alex Beregszaszi、Yoichi Hirai、およびイーサリアムなどのブロックチェーンプラットフォームでスマートコントラクトを作成できるようにするための元イーサリアムコアコントリビューターによって開発されました。.

Solidityは、ECMAScript(Javascript)と非常によく似た構文を持つ、意図的にスリム化された、緩く型付けされた言語です。イーサリアムデザインの理論的根拠のドキュメントから覚えておくべきいくつかの重要なポイントがあります。つまり、32バイトの命令ワードサイズのスタックアンドメモリモデル内で作業しているため、EVM(Ethereum Virtual Machine)はプログラムへのアクセスを提供します。スタック」は、メモリアドレスを固定して、プログラムカウンタループ/ジャンプ(シーケンシャルプログラム制御用)、拡張可能な一時的な「メモリ」、および実際に永続的に書き込まれるより永続的な「ストレージ」を作成できるレジスタスペースのようなものです。ブロックチェーン、そして最も重要なことに、EVMはスマートコントラクト内で完全な決定論を必要とします.

したがって、続行する前に、基本的なSolidityコントラクトの例を確認しましょう。 (githubから取得したコード).

簡単なwhileループをしっかりと実行してみましょう。

契約BasicIterator

{{

アドレス作成者; //予約する "住所"-タイプスポット

uint8 [10]整数; //配列内の10個の8ビット符号なし整数用にストレージのチャンクを予約します

関数BasicIterator()

{{

作成者= msg.sender;

uint8 x = 0;

//セクション1:値の割り当て

while(x < integers.length){

integers [x] = x;

x ++;

}}

関数getSum()定数は(uint){を返します

uint8 sum = 0;

uint8 x = 0;

//セクション2:配列に整数を追加する.

while(x < integers.length){

合計=合計+整数[x];

x ++;

}

合計を返す;

}

//セクション3:契約を破棄する

関数kill()

{{

if(msg.sender ==作成者)

{{

自殺(作成者);

}

}

}

それでは、分析しましょう.

セクション1:値の割り当て

最初のステップでは、10個の8ビット符号なし整数を受け取る「整数」と呼ばれる配列を埋めます。私たちがそれをしている方法は、whileループを経由することです。 whileループ内で何が起こっているかを見てみましょう.

while(x < integers.length){

integers [x] = x;

x ++;

}

整数xにはすでに「0」の値が割り当てられていることを忘れないでください。 whileループは0からintegers.lengthになります。 Integers.lengthは、配列の最大容量を返す関数です。したがって、配列に10個の整数があると判断した場合、arrayname.lengthは値10を返します。上記のループでは、xの値は0〜9(<10)そしてそれ自体の値を整数配列にも割り当てます。したがって、ループの最後では、整数の値は次のようになります。

0、1、2、3、4、5、6、7、8、9.

セクション2:配列コンテンツの追加

getSum()関数内で、配列自体の内容を合計します。これを行う方法は、上記と同じwhileループを繰り返し、変数「sum」を使用して配列の内容を追加することです。.

セクション3:契約を破棄する

この関数は契約を強制終了し、契約の残りの資金を契約作成者に送り返します.

堅実さを生み出す背後にあるインスピレーションと動機について尋ねられたとき、ギャビン・ウッズ博士はこれを言いました:

「それ[Solidity]は、契約を開発するための洗練されたツールであり、最終的には開発者とユーザーの両方にコードの機能に関する優れた情報を提供することを目的としていました。これを支援するために、私は契約に適したドキュメント形式であるNatSpecを考案し、それをSolidityの第一級市民にしました。また、作成可能な正当性の保証の種類を最大化するために、正式な校正言語サブセット(まだ実装されていません)を提案しました.

関数呼び出しに似た形式のLOGに優れた抽象化を提供するために、第一級市民としてイベントをSolidity言語に導入しました。そのためのインスピレーションは、Qtメタオブジェクトシステムの「シグナル」から来ました.

クリスチャンR.と私が一緒に理解した後の1つの機能は、関数修飾子でした。これにより、関数シグネチャの一部として配置された属性が、見かけの関数本体にいくつかの変更を加えることができます。非常に宣言型の表現手段であるため、契約指向プログラミングの分野にうまく当てはまるイディオムです。」

ブロックチェーンコーディング:結論

この記事では、ブロックチェーン内およびその周辺での開発に使用されるブロックチェーンコーディング用の4つの言語のみを取り上げました。実際には、使用できる可能性のある言語は他にもたくさんあります(Java、Go)。あなたがプログラマーなら、あなたの可能性は本当に無限大です。世界がますます分散化され、ブロックチェーンがますます主流になるにつれて、あなたの未来は間違いなく無限です.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me