「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
前言
Remix是一个开源的 用于 Solidity 智能合约开发的Web端IDE,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是 Ethereum 官方设计和支持的程序语言,专门用于编写智能合约。
remix介绍
1.主界面简介
如图所示重要的三个地方,第一个是可以看到我们存放的文件,编写智能合约的地方。
第二个是编译,可以由我们选择编译哪个智能文件,得到字节码。
第三个就是进行部署调试。
2.remix文件
文件结构如图所示
contracts下的.sol后缀都是我们的合约文件。
artifacts文件夹下的是编译后存放的abi文件,为json后缀。
scripts下就是部署合约的脚本,这里一般不用我们修改。
3.remix编译
如图所示编译操作
值得注意的是,我们可以选择对应的版本来编译我们的合约,因为目前有些合约开发的版本还是比较低的,如果我们想调试就得选择对应的版本来编译。
编译后会出现上图界面,可以点击复制我们的abi或者字节码
Bytecode复制出来查看如下
{ "functionDebugData": {}, "generatedSources": [], "linkReferences": {}, "object": "608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100d9565b60405180910390f35b610073600480360381019061006e919061009d565b61007e565b005b60008054905090565b8060008190555050565b60008135905061009781610103565b92915050565b6000602082840312156100b3576100b26100fe565b5b60006100c184828501610088565b91505092915050565b6100d3816100f4565b82525050565b60006020820190506100ee60008301846100ca565b92915050565b6000819050919050565b600080fd5b61010c816100f4565b811461011757600080fd5b5056fea2646970667358221220404e37f487a89a932dca5e77faaf6ca2de3b991f93d230604b1b8daaef64766264736f6c63430008070033", "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x150 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2E64CEC1 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0x6057361D EQ PUSH2 0x59 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x75 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x50 SWAP2 SWAP1 PUSH2 0xD9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x73 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x9D JUMP JUMPDEST PUSH2 0x7E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x97 DUP2 PUSH2 0x103 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xB3 JUMPI PUSH2 0xB2 PUSH2 0xFE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xC1 DUP5 DUP3 DUP6 ADD PUSH2 0x88 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xD3 DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0xEE PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xCA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10C DUP2 PUSH2 0xF4 JUMP JUMPDEST DUP2 EQ PUSH2 0x117 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BLOCKHASH 0x4E CALLDATACOPY DELEGATECALL DUP8 0xA8 SWAP11 SWAP4 0x2D 0xCA 0x5E PUSH24 0xFAAF6CA2DE3B991F93D230604B1B8DAAEF64766264736F6C PUSH4 0x43000807 STOP CALLER ", "sourceMap": "141:356:0:-:0;;;;;;;;;;;;;;;;;;;"}
ABI复制出来查看如下
[ { "inputs": [], "name": "retrieve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "num", "type": "uint256" } ], "name": "store", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
ABI是应用程序二进制接口,简单的理解是合约的接口描述,描述了字段名称、字段类型、方法名称、参数名称、参数类型、方法返回值类型等。当合约被编译后,对应的abi也就确定了。ABI文件字段介绍
- name: 函数名称
- type:方法类型,包括function, constructor, fallback(缺省方法)可以缺省,默认为function
- constant:布尔值,如果为true指明方法不会修改合约字段的状态变量
- payable:布尔值,标明方法是否可以接收ether
- stateMutability:状态类型,包括pure (不读取区块链状态),
- view (和constant类型,只能查看,不会修改合约字段),
- nonpayable(和payable含义一样),
- payable(和payable含义一样)。其实保留payable和constant是为了向后兼容
- inputs:数组,描述参数的名称和类型
- name:参数名称
- type:参数类型
- outputs:和inputs一样,如果没有返回值,缺省是一个空数组
4.remix部署
remix可以使用三种类型的环境:
Javascript VM,
Injected provider
web3 provider
Injected provider 和 web3 provider这两个都需要外部工具。 Javascript VM 模式非常方便,因为是在浏览器中执行。
部署成功如下图所示
这里选择的是Javascript VM部署。此时便可以进行调试了。
这里我们点击了transact按钮,便执行了下面的store方法,把number的值设置为了999。
同时 右下角窗口还能看到我们发出的交易的具体信息。
// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;/** * @title Storage * @dev Store & retrieve value in a variable */contract Storage { uint256 number; /** * @dev Store value in variable * @param num value to store */ function store(uint256 num) public { number = num; } /** * @dev Return value * @return value of 'number' */ function retrieve() public view returns (uint256){ return number; }}
总结
remix 网页IDE是比较方便了我们合约的开发和调试,很多小功能等着慢慢去发掘,首先掌握通用的使用流程,我们已经可以开发属于我们自己的合约了。