以太坊开发学习-solidity(一)环境搭建_搭建以太坊环境-程序员宅基地

技术标签: 学习  区块链  

一 前言

以太坊/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"文件夹下,我们可以找到他们。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_64288219/article/details/136808833

智能推荐

SU-03T语音模块的使用(持续更新)-程序员宅基地

文章浏览阅读1w次,点赞12次,收藏95次。我们在实现各种电路中,肯定会使用到开关这种器件。开关可以是按键,可以是矩阵键盘。但是如果我们用的是语音模块作为开关,可以让自己的产品显得更加高逼格。本博客用于记录本人准备省电子设计大赛过程中使用的SU-03T的语音模块,使用智能公元的开发网页,博客持续更新,小白向。用你的搜索引擎搜索智能公元:智能公元/AIOT快速产品化平台 (smartpi.cn)登录注册什么的在此不详细介绍。A.点击创建产品:B.随便选择一个产品比如什么什么灯具:C.选择纯离线方案,以及SU-03T模组:D.完成各种配置,点击确定,并生_su-03t

robotframework提升篇(三):用例报错后继续执行-程序员宅基地

文章浏览阅读2.8k次,点赞2次,收藏7次。出错后退出在默认情况下,当一个测试用例中的某个关键字返回错误时,这个测试用例就停止执行剩余的关键字。RF会继续执行下一个用例。这么做的好处是节省时间--反正这里出问题要返回来看了,再继续执行剩下的关键字也没有用了。出错后继续执行 但是,有时候,我们却需要执行用例中的所有关键字,例如:要获取更多的出错信息、更改某些全局相关的变量、做teardown或者rollback操作等。这时候,我们...

JVM实战学习——排查java程序 磁盘IO占用过高、CPU占用过高(pidstat)_pidstat查看哪个线程io高-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏11次。JVM实战学习——排查java程序 磁盘IO占用过高、CPU占用过高、内存占用过高(pidstat)一、排查cpu高占用1.示例代码使用以下代码,启动的服务会产生cpu资源大量占用的情况1)占有大量CPU资源2)启动类2.查询项目进程1)使用 jps 命令查询项目启动的进程[root]# jps15539 jar ## 其中15539就是项目进程1349 -- process information unavailable15673 Jps2)或者使用 ps -ef |_pidstat查看哪个线程io高

TIOBE 1 月编程语言排行榜:C 语言再度「C 位」出道!_编程语言排行榜tiobe-程序员宅基地

文章浏览阅读1.8w次,点赞88次,收藏103次。整理 | 屠敏出品 | CSDN(ID:CSDNnews)在 2020 年初雪来临之际,TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘面纱,然意料之外情理之中,获此殊荣的并非是风风火火吵闹了一年又一年的 Python,而是一位低调的老兵——C 语言。Python 惜败,C成为 2019 年度编程语言曾几何时,凭借着“人生..._编程语言排行榜tiobe

Rocket MQ(四)Topic,Topic分片和Queue-程序员宅基地

文章浏览阅读1.1w次,点赞11次,收藏59次。Queue是RocketMQ中的另一个重要概念。在对该概念进行分析介绍前,我们先来看一张图:从本质上来说,RocketMQ中的Queue是数据分片的产物。为了更好地理解Queue的定义,我们还需要引入一个新的概念:Topic分片。在分布式数据库和分布式缓存领域,分片概念已经有了清晰的定义。同理,对于RocketMQ,一个Topic可以分布在各个Broker上,我们可以把一个Topic分布在一个Broker上的子集定义为一个Topic分片。对应上图,TopicA有3个Topic分片,分布在Broker

彻底解决Compiling for iOS xxx, but module ‘xxx‘ has a minimum deployment target of iOS xxx 错误_compiling for ios 9.0, but module 'reactiveswift' -程序员宅基地

文章浏览阅读1.1w次。target ios版本和第三方库ios版本问题问题描述解决方法查看iphone iPad target的最低ios版本修改pod里第三方库问题描述这几天编辑xcode偶尔会发现这个错误,但是有时候重新编译一下错误就消失了,今天彻底解决一下这个错误错误提示:Compiling for iOS 10.0, but module ‘SwiftyJSON’ has a minimum deployment target of iOS 12.0: /Users/tdw/Library/Developer/Xc_compiling for ios 9.0, but module 'reactiveswift' has a minimum deployment t

随便推点

什么是Sparse Reward_spare reward-程序员宅基地

文章浏览阅读1.4k次。agent学习的过程中,常常无法及时获得回报。就像家长让小朋友写作业,小朋友可能觉得这个是负面的反馈而不去写作业(做作业让我觉得很痛苦qwq),而没有意识到以后会获得的巨大回报:写完作业后成绩提高,考上好大学,成为高富帅,从此走向巅峰赢取白富美...这个一开始的暂时的小的reward 就叫 Sparse Reward如何让agent在Sparse Reward 中拥有更好的学习表现?..._spare reward

Centos7设置1920x1080分辨率_centos7调整屏幕分辨率-程序员宅基地

文章浏览阅读9.5k次,点赞6次,收藏29次。Centos7设置分辨率_centos7调整屏幕分辨率

编译与链接的问题 gcc -fPIC -shared_symbol `g_hall_mode' can not be used when making a-程序员宅基地

文章浏览阅读2.8k次。地址无关代码,在64位下编译动态库的时候,经常会遇到下面的错误/usr/bin/ld: /tmp/ccQ1dkqh.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC提示说需要-fPIC编译,然后在链接_symbol `g_hall_mode' can not be used when making a shared object; recompile

SpringCloud之高可用的分布式配置中心(Spring Cloud Config)(七)-程序员宅基地

文章浏览阅读39次。当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如下:准备工作继续使用上一篇文章的工程,创建一个eureka-server工程,用作服务注册中心。在其pom.xml文件引入Eureka的起步依赖spring-cloud-starter-netflix- eureka-server,代码如下:<?xml version=...

c语言中.和->区别,c语言中"->"和"."的区别-程序员宅基地

文章浏览阅读3.5k次,点赞7次,收藏21次。对于c语言中"->"和"."的区别总结如下:1、A.B则A为对象或者结构体;2、A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;3、(*a).b 等价于 a->b。"."一般情况下读作"的”; “->”一般读作"指向的结构体的"。也就是说在结构中,运算符->是运算符*和运算符.的结合4、“->”是指向..._->和.

ubuntu20.04安装ROS2 详细教程-程序员宅基地

文章浏览阅读2.1w次,点赞27次,收藏218次。ubuntu20.04安装ROS2_ubuntu20.04安装ros2