在这里,我将展示一个简单的 PHP 区块链实现示例。这个示例将包括区块链的基本结构,包括区块的创建、链的添加,以及简单的验证功能。

区块链基本结构

  1. 区块(Block):包含数据、前一个区块的哈希、当前区块的哈希等信息。

  2. 区块链(Blockchain):由多个区块组成的链。

示例代码

以下是一个简单的 PHP 区块链示例代码:

<?php

class Block {
    public $index;
    public $timestamp;
    public $data;
    public $previousHash;
    public $hash;

    public function __construct($index, $timestamp, $data, $previousHash = '') {
        $this->index = $index;
        $this->timestamp = $timestamp;
        $this->data = $data;
        $this->previousHash = $previousHash;
        $this->hash = $this->calculateHash();
    }

    public function calculateHash() {
        return hash('sha256', $this->index . $this->previousHash . $this->timestamp . json_encode($this->data));
    }
}

class Blockchain {
    public $chain;

    public function __construct() {
        $this->chain = [];
        // 创建创世区块
        $this->createGenesisBlock();
    }

    public function createGenesisBlock() {
        $genesisBlock = new Block(0, date('Y-m-d H:i:s'), 'Genesis Block', '0');
        $this->chain[] = $genesisBlock;
    }

    public function getLatestBlock() {
        return $this->chain[count($this->chain) - 1];
    }

    public function addBlock($data) {
        $latestBlock = $this->getLatestBlock();
        $newIndex = $latestBlock->index + 1;
        $newTimestamp = date('Y-m-d H:i:s');
        $newBlock = new Block($newIndex, $newTimestamp, $data, $latestBlock->hash);
        $this->chain[] = $newBlock;
    }

    public function isChainValid() {
        for ($i = 1; $i < count($this->chain); $i++) {
            $currentBlock = $this->chain[$i];
            $previousBlock = $this->chain[$i - 1];

            // 检查当前区块的哈希是否正确
            if ($currentBlock->hash !== $currentBlock->calculateHash()) {
                return false;
            }

            // 检查当前区块的前一个哈希是否与前一个区块的哈希匹配
            if ($currentBlock->previousHash !== $previousBlock->hash) {
                return false;
            }
        }
        return true;
    }
}

// 示例使用
$myBlockchain = new Blockchain();
$myBlockchain->addBlock(['amount' => 4]);
$myBlockchain->addBlock(['amount' => 10]);

// 打印区块链
foreach ($myBlockchain->chain as $block) {
    echo "Index: " . $block->index . "\n";
    echo "Timestamp: " . $block->timestamp . "\n";
    echo "Data: " . json_encode($block->data) . "\n";
    echo "Previous Hash: " . $block->previousHash . "\n";
    echo "Hash: " . $block->hash . "\n";
    echo "-----------------------------------\n";
}

// 验证区块链
if ($myBlockchain->isChainValid()) {
    echo "区块链是有效的\n";
} else {
    echo "区块链无效\n";
}
?>
      复制

代码说明

  • Block 类:表示区块,包含索引、时间戳、数据、前一个区块的哈希和当前区块的哈希。

  • Blockchain 类:表示区块链,包含一个区块数组,可以创建创世区块、添加新区块、获取最新区块和验证链的有效性。

  • 示例使用:创建一个区块链实例,添加几个区块,并打印区块链的内容和验证结果。

运行示例

将上述代码保存为 blockchain.php,然后在命令行中使用 php blockchain.php 来运行它。你将看到区块链的输出以及有效性验证的结果。

这是一个非常基础的实现,仅用于学习和理解区块链的基本概念。在实际应用中,区块链的实现会更加复杂,并涉及共识算法、网络协议、加密等多个方面。