検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptで小さなブロックチェーンを実装する方法の紹介(コード付き)

この記事では、JavaScript で小さなブロックチェーンを実装する方法 (コード付き) を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

ブロックチェーンの概念

狭義: ブロックチェーンは、データ ブロックを時系列で連続的に結合するチェーン データ構造であり、暗号的に保証された不変かつ偽造不可能な分散台帳です。

1. マイニング (新しいブロックの生成)

まず、各ブロックが接続されてブロックチェーンが形成されます。ジェネシスブロックとも呼ばれる初期ブロックがあります。このジェネシスブロックでは、乱数(ノンス)を常に変化させて条件を満たすブロックを計算します。 Genesis ブロックの基本情報は次のとおりです。

const initBlock = {
    index: 0,
    data: 'hey,this is a block chain',
    previousHash: '0',
    timestamp: '1551806536961',
    nonce: 80490,
    hash: '0000352fb27dd1141fa7265833190a53e5776b1111e275db0d9a77bf840081e6'
};
  1. index: 各ブロックのシリアル番号を参照します。
  2. data: ブロック内のすべての情報がここに保存されます。転送、残高、その他のデータ
  3. previousHash: 前のブロックのハッシュ値を指します。ジェネシス ブロックには前のブロックはありません。0
  4. タイムスタンプ: の作成を指します。このブロック Time
  5. nonce: これは乱数であり、このnonceを常に変化させて条件を満たすハッシュを計算するのがマイニングです。
  6. hash: このブロックのハッシュ値は、最初の 5 つのフィールドの情報をハッシュすることによって得られる値です。

そして、継続的なハッシュ操作、つまりマイニングを通じて、条件を満たすハッシュが計算されます。マイニングでは難易度を調整することもできます。たとえば、計算されたハッシュ値は最初の 3 桁が 1 である必要がある、または最後の 3 桁が 1 である必要があるなどです。これは、コントロール スイッチがある限り、自分で定義できます。便宜上終了します コントロールするだけです。変数を定義できます

ハッシュ計算:

 .createHash('sha256')
 .update(index + data + previousHash + timestamp + nonce)
 .digest('hex')
_that.difficulty = 3   // 即前3位或者末3位数必须为1,数量越多难度越大

条件を満たすハッシュが生成された後、新しいブロックが生成されますが、このブロックは検証される必要があります。これは、改ざんされた不正なブロックである可能性があるか、チェーンとは何の関係もなく、上記のハッシュ ルールに準拠しているだけのブロックである可能性があるため、有効です。したがって、前後のブロックの妥当性を検証する必要があります。

isValidaBlock(newBlock,lastBlock) {
     if (newBlock.index !== lastBlock.index+1) return false
     if (newBlock.previousHash !== lastBlock.hash) return false
     if (newBlock.timestamp <p>上記の検証に加えて、上記の関数を使用してチェーン全体の各ブロックを検証し、各ブロックの情報が正しく、改ざんされていないことを確認する必要もあります。 </p><p style="white-space: normal;"><strong>2. P2P ネットワークの構築</strong></p><p>ブロックチェーン ネットワークは分散型、つまり中央サーバーのないネットワークであり、クライアントは P2P ネットワークに依存する必要がありません。データを取得または処理するための中央サーバー。ブロックチェーン ネットワークには多数のノードがあります。各ノードは独立したメンバーです。それらはクライアントとサーバーの両方です。ノードはポイントツーポイント (ピアツーピア) で直接接続されています。中央ノードを介して転送されます。したがって、情報セキュリティの観点からは、ポイントツーポイント接続は情報プライバシーにとって非常に信頼性が高くなります。 </p><p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/image/102/511/987/1554254785651010.png?x-oss-process=image/resize,p_40" class="lazy" title="1554254785651010.png" alt="JavaScriptで小さなブロックチェーンを実装する方法の紹介(コード付き)"></p><p>ブロックチェーンはポイントツーポイント接続を通じてデータを送信しますが、その前にガイドとして使用する必要があるもの、それがシードノードです。 2 つのノードは同じドメインに存在しない可能性があるため、相互に接続したい場合は、一方が他方の IP とポートを知っていて、他方に接続できるようにする必要があります。ノードの IP とポート番号: ノードが作成されると、シード ノードはブロックチェーン内のすべてのノードの IP とポート番号をノードに送信し、新しいパートナーの IP とポート番号を記録します。次に、新しいノードがこの「アドレス帳」を取得した後、この「アドレス帳」内のすべての友人にメッセージを送信し、新しい友人が参加したことを伝えます。その後、他のノードはこの情報、つまり新しいパートナーの情報を受け取ります。 IP とポート番号も彼の「アドレス帳」に追加されます。これはホワイトリストに参加することと同等です。このようにして、新しいノードは任意のノードと通信できるようになります。 </p><p>次はコードのデモです: </p><pre class="brush:php;toolbar:false">(res)=>{
  _that.remotePeerInfo = res.data.data   //1
  _that.addPeersList(res.peersList)             //2
  _that.boardCast(_that.remotePeerInfo)    //3
  _that.blockChainUpdate(blockChain,blockData)     //4
}

addPeersList(peers) {
    peers.forEach(peer => {
        if (!_that.peers.find(v => _that.isEqualPeer(peer, v))) {
            _that.peers.push(peer)
        }
    })
}

boardCast(remotePeerInfo) {
    this.peers.forEach(v => {
        this.send(action, v.port, v.address)
    })
}

blockChainUpdate(blockChain,blockData){
  if(newChain.length === 1 ){
    return
    }

    if(_that.isValidaChain(newChain) && newChain.length>_that.blockchain.length){
    _that.blockchain = Object.assign({}, newChain)
    }else{
    console.log('error')
    return
    }

    if (trans.every(v => _that.isValidTransfer(v))) {
    _that.data = trans
    }
}

1. シード ノードから送信された新しいノードの情報 (IP とポート番号を含む) を保存します。新しいノードは状況が変わります。

2. シード ノードからノード リストを受け取り、リスト内のノードを走査して確認し、同じでない場合はリストに書き込みます。

3. 新しいノードの情報をすべてのノードにブロードキャストし、同時に情報を受信したノードはノード リストを更新します

4. 新しいノードの情報のコピーを同期します。同時にシードノードから送信されたブロックチェーン上で各ブロックの情報が処理されます

3. 転送トランザクション

のトランザクションモデルBTC は UTXO を使用します

JavaScriptで小さなブロックチェーンを実装する方法の紹介(コード付き)

この小さなブロックチェーンのトランザクション モデルは最も単純な方法を使用します。

区块链中"现金”,它是一个虚拟的东西就是一个字符串,来源于挖矿。每次挖矿成功都会有一定的奖励,得到的这些“钱”就可以在区块链网络中自由的转账交易。

在区块链中,进行记录转账交易的时候是需要一个加密的算法,把所有的信息进行加密之后再push到新区块中的data中,从而完成一笔新交易的记录。以BTC为例,BTC的加密算法是使用elliptic这个加密算法,elliptic是一个非对称性的加密算法,非对称的加密算法的特点就是,私钥是惟一的,只有拥有者才可以和他私钥对应的公钥进行校验 。 nodejs也有对应的库在github上搜索elliptic即可。

{
  "privateKey": "34a425df3eb1f22fb6cb74b0e7298b16ffd7f3fb",
  "publicKey": "ac208623a38d2906b090dbcf3a09378dfe79b77bf39c2b753ef98ea94fe08dc3995a1bd05c917"
}

上面是一个生成好的密钥对格式,仅作为展示,我删减了一部分长度。

使用银行卡进行转账交易的时候,会有一个转出的账号和一个转入的账号,在区块链中的记账也会有这个账号,这个账号就是上面使用生成的密钥对中的公钥,公钥就是地址,或者说公钥代表的就是自己的钱包。

校验的方法,首先使用字段“from”,“to”,“amount”的参数进行sign签名,然后在每次挖矿(记账)的时候,则使用verify(),通过前面的三个参数,和sig进行校验

verify(type,data){
    swtich(type){
        case 'sign':
            const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)
            let signature = Buffer.from(keypair.sign(bufferMsg).toDER()).toString('hex')
               this.signature =  signature
        break;
        case 'verify':
             const keypairTemp = ec.keyFromPublic(pub, 'hex')
                const bufferMsg = Buffer.from(`${data.from}-${data.to}-${data.amount}`)
             this.keypair = keypairTemp.verify(bufferMsg, sig)
        break;
        default;
    }
}

转帐的时候需要3步,分别是校验转出账户是否有足够的金额,转出账户就是本地公钥。如有则进行记账并且使用两个地址、金额、时间,还有签名加密打包,之后进行全节点广播。其他节点收到这个信息之后第一件事也是对新区块的有效性做一个校验,通过校验之后就会写入data中。

transfer(data)  {
    const timestamp = new Date().getTime()
    const sig = rsa.sign({data.from, data.to, data.amount , timestamp})
    const sigTrans = {data.from, data.to, data.amount ,timestamp, sig }

        // 非创世区块
    if (trans.from !== '0') {
            // 检验余额
        if (!(_that.blance <p>其他节点收到消息之后,先进行去重校验,然后再更新数据。</p><h3 id="四-查询余额">四、查询余额</h3><p>这个链的查询方法比较简单,就是将区块中的每一条交易的信息进行校验和匹配,满足条件的就进行增减,同时忽略精度上的问题。</p><pre class="brush:php;toolbar:false"> this.blance = blance(address)
 blance(address) {
        let blance = 0;
        this.blockchain.forEach(block => {
            block.data.forEach(trans => {
                if (address == trans.from) {
                    blance -= trans.amount
                }

                if (address == trans.to) {
                    blance += trans.amount
                }

            })

        });
        return blance
    }

至此,区块链的最简单的功能就实现完毕。

【相关推荐:JavaScript视频教程

以上がJavaScriptで小さなブロックチェーンを実装する方法の紹介(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

See all articles

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

メモ帳++7.3.1

メモ帳++7.3.1

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