以太坊搭建开发环境和合约例子

以太坊搭建开发环境和合约例子

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字段,且数据输入字段填写为合约字节码。

image-20181006173111712

部署合约成功返回很多数据,其中包括合约地址

这个地址与普通的地址完全相同,是可以向这个地址转账的,合约程序里面可以自定代码如何处理这笔钱

调用合约程序

image-20181006154150824

send

所有改变区块链数据状态的叫做是send操作,相当于发起一笔交易,特点是花钱,大约10s~30s(矿工确认)返回结果。

image-20181006174548856

其中:

1. 0x368b8772是这个函数的哈希
2. a6886xxxx64是HelloWorld的16进制形式
call

所有读取区块链合约数据的操作成为call操作,它的特点是迅速返回无需花钱

调试合约

vm模式下可用

运行环境(EVM)

EVM是以太坊客户端内部虚拟的栈空间,可以执行合约编译的字节码。

image-20181006141029669

小结

账户

普通账户
- 外部账户(普通账户)
- 被私钥控制,仅有余额,没有代码。

合约账户
- 由外部账户创建,有余额,有代码。
- 由外部账户发送消息激活合约账户的代码。

交易

- 由外部账户发出的消息的签名数据包。交易包括:消息的接收者、用于确认发送者的签名、以太币账户余额、发送的数据、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)

智能合约运行环境,存在于每一个节点中,任何人都可以上传程序,并让这些程序自动执行,同时保证现在所有和以前的每个程序的状态总是公开可见的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值