以太坊开发学习-solidity(一)环境搭建

news2024/11/15 8:04:15

文章目录

  • 一 前言
    • 以太坊/Ethereum是什么?
    • 以太坊/Ethereum虚拟机(EVM)
    • 什么是智能合约?
    • 如何构建智能合约?
    • 什么是Solidity?
  • solidity 编译环境
    • 在线编译
      • Remix
    • 本地编译
      • 一. node安装使用
        • 1. 安装 nodejs / npm
        • 2. 安装 Solidity 编译器 solc
        • 3. 自定义项目
        • 4. 使用npm初始化文件夹
        • 5. 在contracts文件夹下创建一个的合约文件Storage.sol
        • 6. 在scripts文件夹下编写编译脚本,compile.js
        • 7. 使用node执行该脚本
        • 8 将调用合约和部署合约需要的内容输出到文件(abi和bytecode)
        • 9. 部署合约脚本
      • 二. idea安装
        • 1、安装IntelliJ solidity 插件
        • 2. 编写智能合约.sol
        • 3.下载Solc 编译器 编译智能合约

一 前言

以太坊/Ethereum是什么?

以太坊是一个去中心化的,运行智能合约的区块链平台。

以太坊/Ethereum虚拟机(EVM)

Ethereum 虚拟机,也称为EVM,是以太坊/Ethereum中智能合约的运行时环境。

可以用某种语言,例如 Solidity
语言,开发智能合约程序,编译成以太坊(Ethereum)虚拟机支持的字节码/bytecode,然后该程序就可以在虚拟机中执行了。

什么是智能合约?

智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由Nick
Szabo首次提出。

智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。

简单地说,智能合约可以理解为一个自执行的协议智能合约可以自动处理协议的履行、管理、以及支付
例如,可以编写这样一个智能合约:本月底之前,老王转账给小张1个以太币,这个智能合约部署后,就会在月底之前,自动把老王的1个以太币转账给小张,无需人为干预。

智能合约是仅在满足特定条件时才在区块链上部署和执行的功能,无需任何第三方参与。

由于智能合约本质上是不可变的和分布式的,因此它们在编写和部署后无法修改或更新。此外,分布式的意义在于任何人都可以检查和查看区块链上的智能合约状态和交易历史。

如何构建智能合约?

尽管 Solidity 是使用最广泛的官方智能合约语言,但智能合约也可以用多种编程语言编写,包括 Javascript、Rust、Go 和
Yul。

什么是Solidity?

Solidity 是一种面向对象的高级编译编程语言,用于编写智能合约。对于有 JavaScript 知识的人来说,Solidity
更容易,因为它在语法上类似于 JavaScript。

solidity 编译环境

在线编译

Remix

如果您只想尝试的Solidity到底是什么鬼,可以尝试 不需要任何安装的Remix是以太坊官方推荐的智能合约开发IDE(集成开发环境),适合新手,可以在浏览器中快速部署测试智能合约,你不需要在本地安装任何程序。如果要在不连接Internet的情况下使用它,可以访问 https://github.com/ethereum/browser-solidity/tree/gh-pages并按照该页面上的说明下载.ZIP文件。

本地编译

一. node安装使用

1. 安装 nodejs / npm

node官方网站下载node,推荐LTS版本,按提示完成安装,npm会同时装上。

2. 安装 Solidity 编译器 solc
$ npm install -g solc

上面的命令将安装solcjs程序,并使其在整个系统中都可用。

验证solc安装:

$ solcjs --version

现在,可以使用本地的 solcjs 了,它比标准的 solidity 编译器少很多特性,但对于学习来说足够了

3. 自定义项目

在这里插入图片描述

  • compiled文件夹存放编译后的文件

  • contracts文件夹存放合约文件

  • scripts文件夹存放脚本

4. 使用npm初始化文件夹
npm init

5. 在contracts文件夹下创建一个的合约文件Storage.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;

contract Storage {
    uint256 number;
    function store(uint256 num) public {
        number = num;
    }
    function retrieve() public view returns (uint256){
        return number;
    }
}

6. 在scripts文件夹下编写编译脚本,compile.js
const fs = require("fs");
const solc = require("solc");
const path = require("path");
//Storage.sol合约文件的路径,__dirname表示当前文件所在目录
const contractPath = path.resolve(__dirname,"../contracts","Storage.sol");
//使用fs加载Storage.sol合约文件
const contractSource = fs.readFileSync(contractPath,"utf-8");

//预先定义编译源输入json对象
let jsonContractSource = JSON.stringify({
    language: 'Solidity',
    sources: {
        'Storage.sol': {  // 指明编译的文件名
            content: contractSource, // solidity 源代码
        },
    },
    settings: { // 自定义编译输出的格式。以下选择输出全部结果。
        outputSelection: {
            '*': {
                '*': [ '*' ]
            }
        }
    },
});
const result = solc.compile(jsonContractSource);
console.log(result);

7. 使用node执行该脚本
node scripts/compile.js

编译后的输入输出json中各字段的含义,可以查看官方中文文档:https://solidity-cn.readthedocs.io/zh/develop/using-the-compiler.html#id5

8 将调用合约和部署合约需要的内容输出到文件(abi和bytecode)
const fs = require("fs");
const solc = require("solc");
const path = require("path");

const contractPath = path.resolve(__dirname,"../contracts","Storage.sol");
const contractSource = fs.readFileSync(contractPath,"utf-8");

//预先定义编译源输入json对象
let jsonContractSource = JSON.stringify({
    language: 'Solidity',
    sources: {
        'Storage.sol': {  // 指明编译的文件名,方便获取数据
            content: contractSource, // 加载的合约文件源代码
        },
    },
    settings: { // 自定义编译输出的格式。以下选择输出全部结果。
        outputSelection: {
            '*': {
                '*': [ '*' ]
            }
        }
    },
});
const result = JSON.parse(solc.compile(jsonContractSource));
if(Array.isArray(result.errors) && result.errors.length){
    console.log(result.errors);
}

storageJson = {
  'abi': {},
  'bytecode': ''
};
//此时的Storage.sol与输入的json对象中定义的编译文件名相同
storageJson.abi = result.contracts["Storage.sol"]["Storage"].abi;
storageJson.bytecode = result.contracts["Storage.sol"]["Storage"].evm.bytecode.object;

//输出文件的路径
const compilePath = path.resolve(__dirname,"../compiled","Storage.json");

//将abi以及bytecode数据输出到文件或者将整个result输出到文件
fs.writeFile(compilePath, JSON.stringify(storageJson), function(err){
    if(err){
        console.error(err);
    }else{
         console.log("contract file compiled sucessfully.");
    }
});

9. 部署合约脚本

(1)在当前目录下,安装web3

npm install web3

(2)在scripts文件夹下编写合约部署脚本deploy.js

const Web3 = require("web3");
//连接本地私链,可以使用ganache-cli搭建。
const web3 = new Web3("http://127.0.0.1:8545");

const fs = require("fs");
const path = require("path");
//加载合约编译后的abi文件以及bytecode文件
const compilePath = path.resolve(__dirname,"../compiled","Storage.json");

const storage = fs.readFileSync(compilePath,"utf-8");
const abi = JSON.parse(storage).abi;
const bytecode = JSON.parse(storage).bytecode;
console.log(abi);
console.log(bytecode);
console.log("-----------------------------------------------");
(async()=>{
    let accounts = await web3.eth.getAccounts();
    console.log("from:",accounts[0]);
    let result = await new web3.eth.Contract(abi)
        .deploy({data:bytecode,arguments:[]})
        .send({from:accounts[0],gas:'1000000'})
        .catch(err=>{
            console.error(err);
        });
    console.log("合约部署成功,合约地址:",result.options.address);
    console.log("合约部署成功,合约地址:",result._address);
})();

(3)使用node执行deploy.js

node scripts/deploy.js

注意:如果本地还未搭建私链,可以使用ganache-cli工具,ganache-cli相当于一个geth客户端,它会在启动时创建10个账户,每个账户100ETH。默认端口8545,每次启动都会重新创建账户,相当于清理了之前的所有东西,每次启动都是全新的。

(1)在npm init初始化一个项目后,下载ganache-cli。

npm install ganache-cli
(2)进入node_modules/.bin/有一个ganache-cli.cmd双击启动或者使用下一步

然后js中使用如下代码就可以连接到本地私有区块链。

const Web3 = require(“web3”); //连接本地私链,可以使用ganache-cli搭建。 const web3 =
new Web3(“http://127.0.0.1:8545”); (3)使用如下代码,不需要手动启动ganache-cli.cmd

const Web3 = require(“web3”); const ganache = require(“ganache-cli”);
//连接本地私链,可以使用ganache-cli搭建。 const web3 = new Web3(ganache.provider());

二. idea安装

1、安装IntelliJ solidity 插件

安装插件

2. 编写智能合约.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract HelloWeb3{
    string public _string = "Hello Web3!";
}

3.下载Solc 编译器 编译智能合约

编译器下载地址
然后将编译器连接到IntelliJ idea中,在设置中找到External Tools,点击+号进行添加:
在这里插入图片描述
在这里插入图片描述

设置相关参数如下:

Name:solidity
Program:D:\software\solidity-windows\solc.exe(注意:这是你安装的solc可执行文件路径,注意核实)
Arguments:–abi --bin F i l e N a m e FileName FileName -o
O u t p u t P a t h OutputPath OutputPath(–abi表示生成相关应用二进制接口、–bin表示生成二进制文件、 O u t p u t P a t h OutputPath OutputPath表示这些生成的文件的存储路径)
或者 --abi --bin F i l e N a m e FileName FileName -o F i l e D i r FileDir FileDir\contract
如果把solidity源码文件放置项目resources目录则生成的abi和bin在项目resources目录下的contract目录,因为下面制定了Working
directory Working
directory: F i l e D i r FileDir FileDir(代表在当前路径,这里指的时右键编译solidity源码时,源码文件对应的路径)

然后编写你的合约文件,要编译时,右键你的合约文件,选择External Tools -> solidity就开始编译你的合约文件了。
在这里插入图片描述

如下图,下面是编译输出结果。
在这里插入图片描述
输出结果就是,使用solc.exe编译器,把demo.sol智能合约代码生成的.abi和.bin文件放到"D:\MyGit\Eth\contract"文件夹下,我们可以找到他们。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DAY 15补 对称二叉树

对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 输入:root [1,2,2,3,4,4,3] 输出:true输入:root [1,2,2,null,3,null,3] 输出:false思路 首先想清楚,判断对称二叉树要比较的是哪两个节…

Redis各场景应用集合

应用场景 1、缓存(Cache),分布式缓存 有一些存储于数据库中的数据会被频繁访问,如果频繁的访问数据库,数据库负载会升高,同时由于数据库IO比较慢,应用程序的响应会比较差。此时,如果引入Redis来…

javaAPI操作Elasticsearch

mapping属性 mapping是对索引库中文档的约束, 常见的mapping属性包括: type: 字段数据类型,常见的简单类型有: 字符串: text(可分词的文本), keyword(精确值, 例如: 品牌,国家)数值: long, integer, short, byte, double, float布尔: boolean日期: date对象: object index: 是否…

EI Scopus检索 | 第二届大数据、物联网与云计算国际会议(ICBICC 2024) |

会议简介 Brief Introduction 2024年第二届大数据、物联网与云计算国际会议(ICBICC 2024) 会议时间:2024年12月29日-2025年1月1日 召开地点:中国西双版纳 大会官网:ICBICC 2024-2024 International Conference on Big data, IoT, and Cloud C…

RediSearch比Es搜索还快的搜索引擎

1、介绍 RediSearch是一个Redis模块,为Redis提供查询、二次索引和全文搜索。要使用RediSearch,首先要在Redis数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。RedSearch使用压缩的反向索引进行快速索引,占用内存少。RedSearch索…

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。 另一方面,hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个…

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…

力扣106---从中序和后序序列构造二叉树

题目描述: 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20…

项目性能优化—使用JMeter压测SpringBoot项目

我们的压力测试架构图如下: 配置JMeter 在JMeter的bin目录,双击jmeter.bat 新建一个测试计划,并右键添加线程组: 进行配置 一共会发生4万次请求。 ctrl s保存; 添加http请求: 配置http请求:…

工控机的无限可能2--智慧城市

一、智能柜 随着网络技术的发展,网购因方便快捷、价格优惠、不受时空限制等优势已成为用户重要的消费方式。快递员因满柜,或柜型单一不能投递,只能将快件堆放在车上或公共过道处苦等,快递、资产管理也随之出现。 如下&#xff0…

使用Windows远程访问Kali Linux桌面

安装xrdp、xfce4 apt-get install -y xrdp xfce4修改 xrdp 配置文件启用 xfce 桌面 vim /etc/xrdp/startwm.sh修改后文件如下: #!/bin/sh # xrdp X session start script (c) 2015, 2017, 2021 mirabilos # published under The MirOS Licence# Rely on /etc/pam…

Unity InputField实现框自适应内容简便方法

要实现InputField框自适应输入内容,除了通过代码进行处理,还可以是使用以下简便的方法。 1、创建InputField组件:右键->UI->Input Field -TextMeshPro。 2、把Input Field Settings中的Line Type设置为Multi Line Newline模式&#x…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇:第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准(2) ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…

ubuntu下在vscode中配置matplotlibcpp

ubuntu下在vscode中配置matplotlibcpp 系统:ubuntu IDE:vscode 库:matplotlib-cpp matplotlibcpp.h文件可以此网址下载:https://github.com/lava/matplotlib-cpp 下载的压缩包中有该头文件,以及若干实例程序。 参考…

钡铼R40工业路由器在果园智能化生产管理系统中的重要角色

在现代果园智能化生产管理系统中,钡铼R40工业路由器扮演着至关重要的角色。它作为物联网技术的核心组件,将果园的智能化管理推向了一个全新的高度,实现了对果园环境、果树生长状况以及各类生产设备的实时监控与精准调控。 首先,钡…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题,相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题,导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因,只是看到一些连锁反应带来的结果…… 影响因素…

内网穿透的应用-如何使用Docker安装DockerUI可视化管理工具无公网IP远程访问

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

glib交叉编译

Glib交叉编译 逸一时,误一世。 —— 田所浩二「夏夜银梦」 交叉编译 GLib 涉及到在一个平台上生成能够在另一个平台上运行的目标文件。在这种情况下,我们将会在一台主机(通常是开发机器)上使用交叉编译工具链来构建 GLib 库&#…

RabbitMQ在Java中使用 SpringBoot 从基础到高级

充分利用每一个监听者 需要充分利用每一个消费者,需要在配置文件中加上prefetch配置并设置为1 rabbitmq:listener:simple:prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息创建交换机和队列 创建队列 "fanout.queue1"&…

RK3588_Qt交叉编译环境搭建

buildroot编译 进入 /home/linux/plat/rk3588/sdk/buildroot 目录下,执行 Source ./envsetup.sh 选择具体平台编译,后再执行make编译 /home/linux/plat/rk3588/sdk/buildroot/output/OK3568/images 生成的rootfs.ext2镜像重新烧写到rk3568开发板中&…