首页 > 其他分享 >使用-solidity-开发第一个-以太坊智能合约

使用-solidity-开发第一个-以太坊智能合约

时间:2024-03-01 18:45:21浏览次数:28  
标签:const 以太 solidity greeting HelloWorld js 智能 truffle Truffle

目录

使用 solidity 开发第一个 以太坊智能合约

前言

使用 solidity 开发一个以太坊区块链的智能合约,并且使用Dapp 进行交互。

项目源代码

最终效果


环境搭建

Nodejs 和 Ganache 请自行安装,然后使用npm安装 Truffle 智能合同框架,web3js 
npm install -g truffle
npm install -g web3
  • Ganache v7.9.1 个人区块链测试环境
  • Solidity - 0.8.19 (solc-js) 以太坊区块链语言
  • Node v18.14.2
  • Truffle v5.11.5 (core: 5.11.5) 智能合约开发框架
  • Web3.js v1.10.0

智能合约内容

我们要实现在智能合约中存储和检索一个字符串值 setGreeting() 设置值, getGreeting() 获取值

Truffle 创建项目


mkdir sc-demo # 创建目录

truffle init # 项目初始化

初始化项目会生成3个文件夹和一个 配置文件

  • contracts 合同文件
  • migrations 部署文件
  • test 测试文件
  • truffle-config.js 配置文件

Truffle 编码

使用命令创建合同文件,也可以手动创建
# 命令创建
truffle create contract HelloWorld
文件生成的路径
contracts/HelloWorld.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract HelloWorld {
  string public  greeting;

  constructor() {
    greeting = "Hello world!";
  }

  function setGreeting(string memory _greeting) public{
    greeting = _greeting;
  }

  function getGreeting() public view  returns (string memory ){
    return greeting;
  }

}

Truffle 打包

修改区块链地址 
truffle-config.js
// 地址是你个人区块链测试地址
development: {
    host: "127.0.0.1", // Localhost (default: none)
    port: 7545, // Standard Ethereum port (default: none)
    network_id: "*" // Any network (default: none)
}
# 打包命令
truffle compile

Truffle 部署

迁移文件的命名规则
Truffle要求迁移文件遵循一定的命名规则,通常是以数字开头,后跟一个描述性名称,如1_initial_migration.js、2_deploy_contracts.js等。数字用于确保迁移按正确的顺序执行。


编写部署文件 
migrations/2_deploy_contracts.js
const HelloWorld = artifacts.require("HelloWorld");

module.exports = function (deployer) {
  deployer.deploy(HelloWorld); 
};

修改编译器版本 0.8.19

  compilers: {
    solc: {
      version: "0.8.19" // Fetch exact version from solc-bin (default: truffle's version)
      // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
      // settings: {          // See the solidity docs for advice about optimization and evmVersion
      //  optimizer: {
      //    enabled: false,
      //    runs: 200
      //  },
      //  evmVersion: "byzantium"
      // }
    }
  }
# 部署命令
truffle migrate

Truffle 测试

创建测试文件

路径 contracts/test/HelloWorld.test.js
const HelloWorld = artifacts.require("HelloWorld");

contract("HelloWorld", (accounts) => {
  it("should return the initial greeting", async () => {
    const instance = await HelloWorld.deployed();
    const greeting = await instance.getGreeting();
    assert.equal(
      greeting,
      "Hello, World!",
      "The initial greeting is not correct"
    );
  });

  it("should set a new greeting", async () => {
    const instance = await HelloWorld.deployed();
    await instance.setGreeting("Hello, Truffle!");
    const greeting = await instance.getGreeting();
    assert.equal(
      greeting,
      "Hello, Truffle!",
      "The new greeting is not set correctly"
    );
  });
});

运行测试命令

truffle test

Dapp

使用web3js 于智能合约交互,get()获取值,set()设置值
<!DOCTYPE html>
<html>

<head>
    <title>Simple Storage DApp</title>
</head>

<body>
    <h1>Simple Storage DApp</h1>
    <input type="text" id="storageValue">
    <button onclick="set()">Set Value</button>
    <button onclick="get()">Get Value</button>
    <p id="value"></p>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/web3.min.js"></script>
    <script>
        const web3 = new Web3(Web3.givenProvider || "http://127.0.0.1:7545");
        const contractAddress = '0x0cf35631BF8B3860c0D63Fc7eB03750566023F70'; // 使用你的合约地址替换这里

        // 使用你的 abi 替换这里
        const contractABI = [
            {
                "inputs": [],
                "name": "greeting",
                "outputs": [
                    {
                        "internalType": "string",
                        "name": "",
                        "type": "string"
                    }
                ],
                "stateMutability": "view",
                "type": "function",
                "constant": true
            },
            {
                "inputs": [
                    {
                        "internalType": "string",
                        "name": "_greeting",
                        "type": "string"
                    }
                ],
                "name": "setGreeting",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
            },
            {
                "inputs": [],
                "name": "getGreeting",
                "outputs": [
                    {
                        "internalType": "string",
                        "name": "",
                        "type": "string"
                    }
                ],
                "stateMutability": "view",
                "type": "function",
                "constant": true
            }
        ] // 使用你的合约ABI替换这里

        const contract = new web3.eth.Contract(contractABI, contractAddress);

        async function set() {
            const accounts = await web3.eth.getAccounts();
            const value = document.getElementById('storageValue').value;
            await contract.methods.setGreeting(value).send({ from: accounts[0] });
        }

        async function get() {
            const value = await contract.methods.getGreeting().call();
            document.getElementById('value').innerText = value;
        }
    </script>
</body>

</html>

命令总结

truffle init #初始化项目

truffle create contract XX #创建合同

truffle compile # 打包

truffle migrate # 部署命令

truffle console --network development # 部署完成后,你可以通过Truffle控制台与智能合约交互

truffle test # 测试

遇到的问题

注意Solidity 0.8.20

这是因为solidity 0.8.20引入了PUSH0(0x5f)操作码,该操作码仅在ETH主网上支持,而在任何其他链上都不支持。这就是为什么其他链找不到PUSH0(0x5f)操作码并抛出此错误的原因。考虑对其他链使用0.8.19。

标签:const,以太,solidity,greeting,HelloWorld,js,智能,truffle,Truffle
From: https://www.cnblogs.com/sjie/p/18047715

相关文章

  • TSINGSEE青犀AI智能分析网关V4工业园区/厂区/工厂智慧安监方案
    一、背景与需求分析随着科技的不断发展,传统的安全监管方式已经难以满足现代工业园区的安全需求。为了提高工业园区的安全监管水平,智慧安监方案成为了新的选择。针对工业园区化工企业多且安全及环保等方面存在风险高、隐患多、精细化管控复杂的情况,需要建立工业园区的智能化视频监......
  • AI智能分析网关V4智慧环保/智慧垃圾站视频智能分析与监控方案
    一、背景介绍随着城市化进程的加速,垃圾处理问题日益受到人们的关注,传统的垃圾站管理方式已经无法满足现代社会的需求。针对当前垃圾站的监管需求,TSINGSEE青犀可基于旗下视频智能检测AI智能分析网关V4与安防监控视频综合管理系统EasyCVR平台,打造智慧垃圾站视频监控与智能分析方案......
  • 智能分析网关V4安全帽检测/反光衣检测/通用工服检测算法及应用
    TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常见的厂家品牌设备,可兼容IPC、网络音柱等,同时也支持智......
  • 常见的智能手机操作系统
    应用在手机上的操作系统主要有Android(谷歌)、iOS(苹果)、windowsphone(微软)、塞班系统(诺基亚)、BlackBerryOS(黑莓)、webos、windowsmobile(微软)、Harmony(华为鸿蒙系统)、卓易操作系统 [4](FreemeOS) [5]等。 基于Android▪SmartisanOS▪IUNIOS▪HTCSense▪LGOptimus▪......
  • 智能驾驶技术名词
    ESA:紧急转向辅助实时监测前向、侧向和侧后方路况,在碰撞危险情况下辅助驾驶转向AEB:自动紧急制动  自动紧急制动系统能够监测车辆前方的障碍物,并在检测到碰撞风险时自动进行制动以减少碰撞的严重程度或避免碰撞。ELKA:紧急车道保持在面临驶出车道与同向或对向车辆有碰撞......
  • 智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人
    智能咖啡厅助手:人形机器人+融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)“机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术,开发能在模拟的咖啡厅场景中承担服务员角色并自主完成各种具身任务的智能机器人。这里......
  • 以太网协议号
    以太网协议号typenamedesrfc1ICMPInternetControlMessage[RFC792]2IGMPInternetGroupManagement[RFC1112]3GGPGateway-to-Gateway[RFC823]4IPIPinIP(encapsulation)[RFC2003]5STStream[RFC1190,RFC1819]6TCPTransmissionCont......
  • 计算巢AppFlow-如何在钉钉群实现智能答疑
    随着大模型能力越来越强大,利用大语言模型进行智能答疑已经成为了一个非常普遍和常见的场景。然而,各个产品或业务方要能够准确有效地进行答疑,仅依靠大模型的通用能力是远远不够的,这时候利用私有领域FAQ文档进行大模型的检索增强生成往往可以有效解决上述问题。通义百炼平台提供了......
  • 智能分析网关V4电瓶车检测与烟火算法,全面提升小区消防安全水平
    2024年2月23日,南京市某小区因电瓶车停放处起火引发火灾事故,造成巨大人员伤亡和损失。根据国家消防救援局的统计,2023年全国共接报电动自行车火灾2.1万起。电瓶车火灾事故频发,这不得不引起我们的重视和思考,尤其是在小区的管理中,电瓶车安全监管更是重中之重。随着科技的快速发展,AI视......
  • 【转】打造大模型Agent:百度智能云千帆杯竞赛第一期解题思路
    随着大型语言模型的进步,使用大模型构建人工智能代理(AIAgents)逐渐成为学术界和业界关注的领域。在这些新兴的研究中,大型语言模型扮演着人工智能代理的核心智能,即它们的“大脑”。这些基于大型语言模型的智能代理(LLM-basedAgents)通过集成了先进的语言理解和生成能力的模型,展现出在......