以太坊区块链网络部署及验证实验

慈云数据 2024-03-27 技术支持 70 0

以太坊区块链网络部署及验证实验

文章目录

  • 以太坊区块链网络部署及验证实验
    • 1 Go1.19安装
      • 1.1 下载 Go 1.19
      • 1.2 解压文件
      • 1.3 设置环境变量
      • 1.4 验证安装
      • 2 geth1.10.25安装
        • 2.1 方法 1: 下载二进制文件
        • 2.2 方法 2: 从源代码编译
        • 2.3 方法3:直接下载编译好的
        • 3 部署以太坊区块链私有网络
          • 3.1启动私链
            • 创建创世区块信息文件:genesis.json
            • 初始化一个以太坊节点数据目录
            • 启动一个以太坊节点
            • 访问日志文件
            • 链内创建账户 `personal.newAccount()`
            • 执行结果
            • 启动挖矿 `miner.start()`
            • 3.2 多节点交互
              • 创建多个文件夹和节点
              • 节点之间建立联系
                • 使用 `admin.addPeer()` 添加节点
                • 使用admin.addPeer()
                • 在 `--datadir` 目录中添加 `static-nodes.json` 文件
                • 使用 `--bootnodes` 启动节点
                • 3.3 remix平台
                  • 合约代码
                  • abi文件
                  • 四个节点节点信息
                  • 3.4 存储操作的命令
                  • 3.5 根据key查询value操作的命令

                    国科大2023秋季学期计算机网络实验,简单记录一下实验流程

                    1 Go1.19安装

                    在 Ubuntu 上安装 Go 1.19 版本可以通过以下步骤进行:

                    1.1 下载 Go 1.19

                    首先,打开终端。从 Go 语言的官方网站下载最新版本。使用 wget 或 curl 命令下载 Go 1.19 的 tarball。

                    wget https://dl.google.com/go/go1.19.linux-amd64.tar.gz
                    

                    确保下载链接是最新的,可以在 Go 语言官方下载页面 上找到正确的链接。

                    1.2 解压文件

                    下载完成后,解压文件到 /usr/local 目录。这个目录通常用于存放用户级的软件安装。使用以下命令:

                    sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
                    

                    这将在 /usr/local 中创建一个 go 目录。

                    1.3 设置环境变量

                    要使用 Go,需要将 Go 的 bin 目录添加到你的 PATH 环境变量中。在 .profile 或 .bashrc 文件中设置这个变量。以下是在 .profile 文件中设置的示例命令:

                    echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile
                    

                    然后,使更改生效:

                    source ~/.profile
                    

                    或者,如果使用的是 bash shell,修改 .bashrc 文件:

                    echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.bashrc
                    source ~/.bashrc
                    

                    1.4 验证安装

                    安装完成后,重新启动终端或使用 source 命令更新当前会话。然后,使用以下命令来验证 Go 是否正确安装:

                    go version
                    

                    如果一切正常,这将显示 Go 的版本信息,类似于 go version go1.19 linux/amd64。

                    注意事项:

                    • 如果之前安装了旧版本的 Go,可能需要先卸载旧版本或确保新版本的路径已正确添加到你的 PATH 中。
                    • 确保下载的 Go 版本与你的系统架构(如 amd64, arm64 等)相匹配。

                      安装完成后:

                      在这里插入图片描述

                      2 geth1.10.25安装

                      在 Ubuntu 上安装 Geth 版本 1.10.25 通过下载特定版本的二进制文件或从源代码编译来实现。下面是具体步骤:

                      2.1 方法 1: 下载二进制文件

                      1. 访问 Geth GitHub 仓库:
                      • 打开 Go-Ethereum Releases 页面。
                        1. 下载特定版本:
                          • 在 Releases 页面中,找到 1.10.25 版本。
                        • 下载适用于 Linux 的文件,通常会是一个名为 geth-linux-amd64-1.10.25-xxxxxx.tar.gz 的压缩文件。
                          1. 解压文件:

                            • 使用命令行解压下载的文件。例如:

                              tar -xvzf geth-linux-amd64-1.10.25-xxxxxx.tar.gz
                              
                            • 移动 Geth 到可执行目录:

                              • 将解压后的 geth 可执行文件移动到一个在你的 PATH 环境变量中的目录,如 /usr/local/bin。

                                sudo mv geth-linux-amd64-1.10.25-xxxxxx/geth /usr/local/bin/
                                
                              • 验证安装:

                                • 在终端执行以下命令以确认安装:

                                  geth version
                                  

                          2.2 方法 2: 从源代码编译

                          如果想从源代码编译 Geth,可以按照以下步骤操作:

                          1. 安装编译依赖:

                            • 安装 build-essential、git、golang 等必要工具:

                              sudo apt-get update
                              sudo apt-get install -y build-essential git golang
                              
                            • 克隆源代码仓库:

                              • 克隆 Go-Ethereum 仓库:

                                git clone https://github.com/ethereum/go-ethereum.git
                                
                              • 切换到指定版本:

                                • 进入仓库目录,并切换到 1.10.25 版本:

                                  cd go-ethereum
                                  git checkout v1.10.25
                                  
                                • 编译 Geth:

                                  • 在仓库根目录下执行编译命令:

                                    make geth
                                    
                                  • 安装 Geth:

                                    • 将编译好的 geth 可执行文件复制到 /usr/local/bin:

                                      sudo cp build/bin/geth /usr/local/bin/
                                      
                                    • 验证安装:

                                      • 运行 geth version 来验证安装。

                          注意事项:

                          • 从源代码编译可能需要一定时间,取决于你的系统性能

                            注:以上两种方式都需要可访问外网才可

                            (其实是calsh删库跑路了,我没找到linux版本的calsh进行科学上网,所以才有了方法三)

                            2.3 方法3:直接下载编译好的

                            在网上找到一个编译好的版本。

                            下载:https://download.csdn.net/download/yezhijing/86811420

                            解压改文件:

                            tar -xvzf geth-linux-amd64-1.10.25-xxxxxx.tar.gz
                            

                            后续同方法1 4,5

                            效果:

                            在这里插入图片描述

                            3 部署以太坊区块链私有网络

                            3.1启动私链

                            创建创世区块信息文件:genesis.json
                            {
                                "config": {
                                      "chainId": 1001,//据说666没法进行多节点交互,不知道为啥,迷之操作
                                      "homesteadBlock": 0,
                                      "eip150Block": 0,
                                      "eip155Block": 0,
                                      "eip158Block": 0
                                  },
                                "coinbase"   : "0x0000000000000000000000000000000000000000",
                                "difficulty" : "0x1111111",
                                "extraData"  : "",
                                "gasLimit"   : "0x2fefd8",
                                "nonce"      : "0x0000000000000042",
                                "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
                                "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
                                "timestamp"  : "0x00",
                                "alloc"      : {}
                             }
                            
                            初始化一个以太坊节点数据目录
                            # 当前目录/home/network/ethdata
                            geth --datadir ./ init genesis.json
                            #node1
                            geth --datadir ./node2 init ./genesis.json
                            #node2
                            geth --datadir ./node3 init ./genesis.json
                            #node3
                            geth --datadir ./node3 init ./genesis.json
                            

                            这条命令是用于初始化一个以太坊 (Ethereum) 节点的 Geth 客户端的命令,它配置了节点的数据存储目录并设置了初始的区块链状态(创世块)。命令中的各个部分有特定的含义:

                            • geth:这是执行以太坊节点的命令行工具(客户端)。

                            • --datadir ./ethdata:这个参数告诉 Geth 在当前目录下的 ethdata 文件夹中存储所有区块链数据。如果该文件夹不存在,Geth 会自动创建它。

                            • init:这个子命令用于初始化一个新的区块链或重置已有区块链的状态。

                            • genesis.json:这个文件定义了创世块的配置,它是 JSON 格式的文件。这个文件包含了区块链初始状态的信息,比如预置的账户余额、共识规则、网络ID等。

                              运行这条命令后,Geth 会根据 genesis.json 文件中的信息,创建一个创世块,并将其存储在指定的数据目录中。这是搭建新的私有以太坊网络的第一步。

                              效果如图:

                              在这里插入图片描述

                              启动一个以太坊节点
                              geth --datadir ./ --networkid 1001 --identity "node1" --port 30303 --http  --nodiscover --verbosity 4 console 2 > node1.log
                              geth --datadir ./node2 --networkid 1001 --identity "node2" --port 30304 --http --http.port 8546 --authrpc.port 8547 --nodiscover --verbosity 4 console 2 > node2.log
                              geth --datadir ./node3 --networkid 1001 --identity "node3" --port 30305 --http --http.port 8548 --authrpc.port 8549 --nodiscover --verbosity 4 console 2 > node3.log
                              #==================================================================================
                              geth --datadir ./ --networkid 1001 --identity "node1" --port 30303 --http --http.port 8545 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net" --vmdebug --nodiscover --verbosity 4 console 2 > node1.log
                              # 节点2
                              geth --datadir ./node2 --networkid 1001 --identity "node2" --port 30304 --http --http.port 8546 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net"  --authrpc.port 8547 --nodiscover --verbosity 4 console 2 > node2.log
                              # 节点3
                              geth --datadir ./node3 --networkid 1001 --identity "node3" --port 30305 --http --http.port 8548 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net"  --authrpc.port 8549 --nodiscover --verbosity 4 console 2 > node3.log
                              # 节点4
                              geth --datadir ./node4 --networkid 1001 --identity "node3" --port 30306 --http --http.port 8550 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net"  --authrpc.port 8549 --nodiscover --verbosity 4 console 2 > node4.log
                              

                              geth --datadir /ethdata --networkid 1001 --identity "node1" --port 30303 --http --nodiscover --verbosity 4 console 2 > node1.log 用于启动 Geth 节点,并具有以下配置:

                              1. --datadir /ethdata:

                                指定 Geth 存储区块链数据的目录为 /ethdata。请确保此目录存在且可写。

                              2. --networkid 1001:

                                设置私有网络的网络ID为 1001。这个值在私有网络中是必要的,以区分不同的以太坊网络。

                              3. --identity "node1":

                                为节点设置一个标识名 “node1”。

                              4. --port 30303:

                                设置节点之间通信的端口为 30303,这是默认的以太坊 P2P 端口。

                              5. --http:

                                启用 HTTP RPC 服务,使可以通过 HTTP 请求与节点交互。

                              6. --nodiscover:

                                禁用节点发现。这意味着节点不会主动去发现其他节点,适用于私有网络。

                              7. --verbosity 4:

                                设置日志详细级别为 4。这将提供较详细的日志输出。

                              8. console:

                                打开 Geth 的 JavaScript 控制台,允许节点交互。

                              9. 2 > node1.log:

                                将标准错误(stderr)输出重定向到文件 node1.log。这意味着错误和一些日志信息将被写入此文件。

                              在这里插入图片描述

                              访问日志文件

                              通过 tail -f node1.log 命令来实时查看 node1.log 文件的内容,这对于调试和监控节点状态很有用。

                              在这里插入图片描述

                              链内创建账户 personal.newAccount()
                              1. 打开新的终端,并确保Ethereum节点正在运行(已使用命令启动)。

                              2. 连接到节点的JavaScript控制台。运行以下命令:

                                geth attach
                                geth attach ipc:./geth.ipc 
                                

                                在这里插入图片描述

                              3. 在JavaScript控制台中,使用以下命令创建一个新账户:

                                personal.newAccount()  
                                
                                 
                              执行结果

                              personal.newAccount()

                              Passphrase:

                              Repeat passphrase:

                              “0x6b754c28176d8146dabddf3a3b3f310802761135”

                               
                               
                              

                              在这里插入图片描述

                              系统将提示输入密码来保护新账户,并生成一个新的以太坊地址。

                              启动挖矿 miner.start()

                              在JavaScript控制台中,运行以下命令以开始挖矿(在私有网络上挖矿是可行的,公网没有强大的算力应该挖不到吧):

                              miner.start()
                              

                              在这里插入图片描述

                              这将开始挖矿操作,并将挖矿奖励发送到创建的账户。

                              3.2 多节点交互

                              创建多个文件夹和节点
                              1. 创建多个目录,每个目录将用于一个独立的节点 node2, node3, node4 。

                              2. 在每个节点目录中,创建一个新的数据目录,以存储节点数据 ./node2, ./node3, ./node4。

                              3. 在每个节点目录中,使用创世区块信息文件 genesis.json ,以便每个节点都使用相同的创世区块。

                              4. 使用不同的标识(identity)、端口和数据目录启动不同的节点。例如,对于第二个节点:

                                 geth --datadir ./node2 --networkid 1001 --identity "node2" --port 30304 --http --http.port 8546 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net"  --authrpc.port 8547 --nodiscover --verbosity 4 console 2 > node2.log
                                

                                对于第三个节点:

                                geth --datadir ./node3 --networkid 1001 --identity "node3" --port 30305 --http --http.port 8548 --http.corsdomain "https://remix.ethereum.org" --http.api "web3,eth,debug,personal,net"  --authrpc.port 8549 --nodiscover --verbosity 4 console 2 > node3.log
                                

                                以此类推。

                              节点之间建立联系
                              使用 admin.addPeer() 添加节点

                              在每个节点的JavaScript控制台中,可以使用 admin.addPeer() 来添加其他节点。例如,对于节点2来说,可以执行以下命令:

                              admin.addPeer("enode://enode-info")
                              

                              其中,enode-info 是其他节点的 enode 信息。

                              使用admin.addPeer()

                              1、在第一个节点中使用admin.nodeInfo.enode命令查看enode信息,如下所示:

                              admin.nodeInfo.enode
                              
                              "enode://2c4eb7a267b1c00a8550e0237277234ca4bf8076b48268693e689f0657d6eb40eb88ee3f4d619b2361471c72881918a300a0de2943f6a29bd2a7c78e7a820d85@127.0.0.1:30303?discport=0"
                              

                              2、在新建节点中使用admin.addPeer命令添加联系,如下所示:

                              admin.addPeer("enode://2c4eb7a267b1c00a8550e0237277234ca4bf8076b48268693e689f0657d6eb40eb88ee3f4d619b2361471c72881918a300a0de2943f6a29bd2a7c78e7a820d85@127.0.0.1:30303?discport=0")
                              
                              true
                              

                              3、添加完成后如图所示

                              在这里插入图片描述


                              查看当前以太坊节点已经连接的对等节点(peers)的信息

                              admin.peers
                              

                              在这里插入图片描述

                              在 --datadir 目录中添加 static-nodes.json 文件

                              在节点的 --datadir 目录中创建一个 static-nodes.json 文件,以让节点知道其他节点的联系信息。此文件包含其他节点的 enode 信息。

                              使用 --bootnodes 启动节点

                              在启动节点时,可以使用 --bootnodes 参数来指定引导节点(bootstrap node),这些节点通常是网络上的一些已知节点,用于引导新节点加入网络。

                              例如,如果要将节点2连接到节点1,可以使用以下命令:

                              geth --datadir ./node2 --networkid 1001 --identity "node2" --port 30304 --http --nodiscover --verbosity 4 --bootnodes "enode://enode-info-of-node1" console 2 > node2.log
                              

                              请替换 enode-info-of-node1 为节点1的实际 enode 信息。

                              这些步骤创建多个节点,使它们互相连接,并与以太坊私有链进行交互。确保在实际操作中修改配置以适应网络和需求。


                              enode-info-of-node1 是一个占位符,代表节点1的实际 enode 信息。每个以太坊节点都有一个唯一的 enode 标识符,用于在网络中标识和连接到其他节点。要在节点1上获取节点1的 enode 信息,可以按照以下步骤操作:

                              1. 打开节点1的JavaScript控制台,连接到节点1,如下所示:
                               geth attach
                              
                              1. 在节点1的JavaScript控制台中,运行以下命令来获取节点1的 enode 信息:

                                admin.nodeInfo.enode
                                

                                这将返回节点1的 enode 信息,类似于以下内容(示例数据,实际数据会有所不同):

                                "enode://5a5f7d1a3f2b9c39e5e31c1e15da40a9b9853d15a8a746799d9aa8505b0912f2d22c52f9971d144f3c9d2ba1ea2bf6cb75371ccf4f93cbcd10b2f8cd8@192.168.1.100:30303"   
                                

                                将此信息复制并替换 enode-info-of-node1,然后将该命令用于启动其他节点,以便它们可以连接到节点1。


                              3.3 remix平台

                              https://remix.ethereum.org/

                              Remix是一种用于以太坊智能合约开发的在线集成开发环境(IDE),它提供了一个友好的界面,使开发人员能够轻松地创建、测试和部署以太坊智能合约。以下是一些关于Remix平台的信息:

                              1. 在线IDE:Remix是一个基于Web的在线IDE,无需下载或安装任何软件。只需通过浏览器访问Remix官方网站,就可以开始使用。

                              2. 智能合约开发:Remix支持Solidity智能合约语言,并提供了代码编辑器、编译器和调试工具,使开发人员能够创建和测试智能合约。

                              3. 内置编译器:Remix包含了一个内置的Solidity编译器,可以将Solidity合约编译成字节码,以便在以太坊虚拟机上执行。

                              4. 部署和测试:Remix允许将智能合约部署到不同的以太坊网络上,并提供了模拟器和测试工具,以便进行合约测试。

                              5. 交互式调试:Remix提供了交互式调试功能,允许在合约执行过程中逐步执行代码并查看变量状态。

                              6. 插件支持:Remix支持插件,可以通过安装插件来扩展其功能,例如与硬件钱包集成、代码静态分析等。

                              7. 多网络支持:Remix支持连接到不同的以太坊网络,包括本地开发网络、测试网络和主网络等。

                              8. 自动保存:Remix会自动保存项目和代码,以确保不会丢失任何进展。

                              9. 开源:Remix是一个开源项目,可在GitHub上找到其源代码并参与贡献。

                              点击deploy 启动挖矿

                              在这里插入图片描述

                              在这里插入图片描述

                              合约代码
                              // SPDX-License-Identifier: GPL-3.0
                              pragma solidity >=0.4.16  {
                                  web3.eth.sendSignedTransaction(signedTx.rawTransaction)
                                      .on('receipt', receipt => {
                                          console.log('Transaction receipt:', receipt);
                                      });
                              });
                              

                              3.5 根据key查询value操作的命令

                              const Web3 = require('web3');
                              const web3 = new Web3('https://127.0.0.1:8854');
                              const contractABI = [0x5B38Da6a701c568545dCfcB03FcB875f56beddC4]; // 合约的ABI
                              const contractAddress = '0x87ffd8ade60e42979d05c9f20c82da7bc3b83edd90b5e21b99f1c7fc22b3f4c4'; // 合约地址
                              const contract = new web3.eth.Contract(contractABI, contractAddress);
                              const key = '123456';
                              contract.methods.getValue(key).call()
                                  .then(result => {
                                      console.log('Value for key', key, 'is', result);
                                  });
                              
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon