文章目录
- 一 前言
- 以太坊/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.cmdconst 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"文件夹下,我们可以找到他们。