以太坊搭建开发环境和合约例子
Remix介绍
官方出的一个在线版的编译器
Remix在线编译环境
https://remix.ethereum.org/#optimize=true&version=soljson-v0.5.0+commit.1d4f565a.js&evmVersion=null
Remix本地编译环境
调试方便、相对稳定
安装:
npm install remix-ide -g
启动:
remix-ide
访问
http://localhost:8080
合约案例
pragma solidity ^0.5.0; //指定编译器版本
//每一句代码都要分号
//每一个合约都要使用contract开头,定义一个合约
contract Inbox{
//在合约内,函数外的变量,我们叫做状态变量,真正写入区块链的数据
string public message;
//构造函数,合约定义的时候执行且只执行一次
constructor() public {
}
//定义普通函数
//每一个函数都可以修饰为public、private权限,internal、external
function setMessage(string memory newMessage) public{
message = newMessage;
}
//读取数据,读免费
//如果有返回值,需要制定returns关键字修饰,同时标注返回值类型,使用圆括号包裹,可以返回多个返回值
function getMessage() public view returns(string memory){
return message;
}
}
编译合约
remix
编辑器中自动集成了solidity
的编译器,所以可以自动编译我们的合约代码
使用remix,由高级语言变成机器语言:
solidity ---> bytecode(机器语言,区块链系统读取)
solidity ---> ABI (application binary interface)(方便程序员调用)
bytecode
bytecode
是真正上传到以太坊的合约的二进制码
类似
6080604052610410806100136000396000f300608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063368b87721461005c578063ce6d41de146100c5578063e21f37ce1......
abi
application binary interface
应用二进制接口,用于描述合约,从而引导以太坊虚拟机与合约bytecode交互
负责解析合约的二进制码
json
格式的描述文件
如果一个状态变量被修饰为Public,为了方便用户访问,那么solidity编译器会自动生成一个同名的访问函数
[
{
"constant": false,
"inputs": [
{
"name": "newMessage",
"type": "string"
}
],
"name": "setMessage",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "getMessage",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [],
"name": "message",
"outputs": [
{
"name": "",
"type": "string"
}
],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"payable": true,
"stateMutability": "payable",
"type": "constructor"
}
]
部署合约
部署合约也是一笔交易,只不过不用填写to
字段,且数据输入
字段填写为合约字节码。
部署合约成功返回很多数据,其中包括合约地址
这个地址与普通的地址完全相同,是可以向这个地址转账的,合约程序里面可以自定代码如何处理这笔钱
调用合约程序
send
所有改变区块链数据状态的叫做是send操作,相当于发起一笔交易,特点是花钱,大约10s~30s(矿工确认)返回结果。
其中:
1. 0x368b8772是这个函数的哈希
2. a6886xxxx64是HelloWorld的16进制形式
call
所有读取区块链合约数据的操作成为call操作,它的特点是迅速返回,无需花钱
调试合约
仅vm
模式下可用
运行环境(EVM)
EVM是以太坊客户端内部虚拟的栈空间,可以执行合约编译的字节码。
小结
账户
普通账户
- 外部账户(普通账户)
- 被私钥控制,仅有余额,没有代码。
合约账户
- 由外部账户创建,有余额,有代码。
- 由外部账户发送消息激活合约账户的代码。
交易
- 由外部账户发出的消息的签名数据包。交易包括:消息的接收者、用于确认发送者的签名、以太币账户余额、发送的数据、STARTGAS、GASPRICE。
- 转账是交易
- 存储内容到区块链是交易(转账或合约来实现)
- 调用合约都交易
智能合约
部署在以太坊上的程序
消息
由合约发起的内部调用,也是一笔交易
Gas
以太坊上的每笔交易都会收取一定的燃料gas,每个操作都消耗gas,明码标价
gas价格由交易创建者设置,交易费用eth = GASPRICE * Gas Used. (Wei)
Gas Price
gas的价格,自定义
Gas Limit
- 单笔交易的gas limit:21000 gas
- 单个区块的gas limit:800万 gas 上下,由矿工决定,在挖矿软件配置
以太坊虚拟机(EVM)
智能合约运行环境,存在于每一个节点中,任何人都可以上传程序,并让这些程序自动执行,同时保证现在所有和以前的每个程序的状态总是公开可见的。