# web3_blockchain **Repository Path**: cheerlee/web3_blockchain ## Basic Information - **Project Name**: web3_blockchain - **Description**: web3_blockchain - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-05-07 - **Last Updated**: 2024-11-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: web3 ## README ### 工具 - 区块链钱包插件:`MetaMask` 浏览器插件市场 - MetaMask插件安装 - 智能合约工具:`Truffle Framework` 提供一套用于开发以太坊智能合约的工具 开发环境,测试框架 提供了智能合约管理、部署和迁移、网络管理、开发控制台等工具 - 以太坊测试链:`Ganache` 一个 个人区块链,一个本地开发区块链,用来模仿公共区块链的所以行为 - 编写智能合约语言:`Solidity`,一种用于实现智能合约的面向对象的高级语言 - 智能合约必须部署到链上进行测试,部署和测试时间较长,需要申请一些假的代币,对于开发者最好部署在私链上,`Ganache` 是以太坊开发的个人区块链 中心化app的数据存储在中心化服务器上,Dapp的数据库存储在区块链上  ```bash # 下载安装Truffle Framework npm install -g truffle # 快速构建一个本地ETH网络 npm install ganache --global # 启动本地ETH网络 ganache # 选择一个测试私钥导入到MetaMask账号,设置/高级/显示测试网络 - 启用 # 项目文件夹创建区块链文件夹blockchain mkdir blockchain # 在区块链文件夹中再创建一个合约文件夹contracts cd blockchain mkdir contracts cd contracts # 创建一个truffle项目,开发智能合约 truffle init # truffle初始化 # 智能合约,文件夹结构 blockchain/contracts/ # 区块链文件夹/智能合约 contracts # 编写智能合约 migrations # 将迁移新创建的智能合约 test # 测试智能合约 truffle-config.js # truffle配置 # 编写智能合约 # blockchain/contracts/contracts中新建文件Contacts.sol写入 // SPDX-License-Identifier: MIT # 指定solidity版本 pragma solidity >=0.4.22 <0.9.0; # 编写第一个智能合约 contract Contacts { uint public count = 0; // 状态变量 } // count是一个特殊变量,写入该变量的任何数据都将存储在区块链存储中,public修饰符允许智能合约外对其访问 # 前端React # 在blockchain文件夹执行create-react-app脚手架 npx create-react-app contacts # 添加web3.js依赖 cd contacts npm install web3 # create-react-app >= 5执行(create-react-app版本高于5不包含polyfill,报错) npm install --dev react-app-rewired crypto-browserify stream-browserify assert stream-http https-browserify os-browserify url buffer # react项目根目录 contacts创建react和智能合约配置文件,config-overrides.js const webpack = require("webpack"); module.exports = function override(config) { const fallback = config.resolve.fallback || {}; Object.assign(fallback, { crypto: require.resolve("crypto-browserify"), stream: require.resolve("stream-browserify"), assert: require.resolve("assert"), http: require.resolve("stream-http"), https: require.resolve("https-browserify"), os: require.resolve("os-browserify"), url: require.resolve("url"), }); config.resolve.fallback = fallback; config.plugins = (config.plugins || []).concat([ new webpack.ProvidePlugin({ process: "process/browser", Buffer: ["buffer", "Buffer"], }), ]); return config; }; # 修改package.json启动方式 "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "test": "react-app-rewired test", "eject": "react-scripts eject" } # App.js测试账号状态 import { useEffect, useState } from "react"; import Web3 from "web3"; function App() { const [account, setAccount] = useState(); // 设置账号的状态变量 useEffect(() => { async function load() { const web3 = new Web3( Web3.givenProvider || "http://localhost:7545" ); const accounts = await web3.eth.requestAccounts(); setAccount(accounts[0]); } load(); }, []); return