以太坊solidity简介
以太坊介绍
以太坊(Ethereum)是一个建立在区块链技术之上,去中心化应用平台。它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用。
Solidity
以太坊中可以使用任何高级语言一样来编写智能合约,智能合约的默认的编程语言是Solidity,文件扩展名以.sol结尾。Solidity是一种语法类似JavaScript的高级语言。它被设计成以编译的方式生成以太坊虚拟机代码。使用Solidity很容易创建用于投票、众筹、封闭拍卖、多重签名钱包等等的智能合约。
Solidity智能合约文件结构
//版本申明 pragma solidity ^0.4.18;
//引用 import “filename”;
//合约 contract ContractName{ ... } |
Solidity的合约和面向对象语言中的类的定义相似。每个合约包括了状态变量,函数,函数修饰符,事件,结构类型 和枚举类型。另外,合约也可以从其他合约中继承 。
- 状态变量是在合约存贮器中永久存贮的值
- 函数是合约中可执行单位的代码
- 函数修饰符可以在声明的方式中补充函数的语义
- 事件是和EVM(以太虚拟机)日志设施的方便的接口
- 结构是一组用户定义的变量
- 枚举是用来创建一个特定值的集合的类型
关于Solidity的语法教程推荐一个博客:
1 | https://www.cnblogs.com/tinyxiong/p/7997755.html | |
2 | https://www.cnblogs.com/tinyxiong/p/8031730.html | |
3 | https://www.cnblogs.com/tinyxiong/p/8039808.html | |
4 | https://www.cnblogs.com/tinyxiong/p/8084477.html | |
5 | https://www.cnblogs.com/tinyxiong/p/8108051.html | |
6 | https://www.cnblogs.com/tinyxiong/p/8137729.html | |
7 | https://www.cnblogs.com/tinyxiong/p/8407233.html | |
8 | https://www.cnblogs.com/tinyxiong/p/8573900.html | |
9 | ||
10 | https://www.cnblogs.com/tinyxiong/p/8783611.html |
Remix
Remix是一个开源的 Solidity 智能合约开发环境,提供基本的编译、部署至本地或测试网络、执行合约等功能。Solidity 是以太坊Ethereum 官方设计和支持的开发语言,专门用于编写智能合约。
Remix适合编程经验不多的初学者。但无法做到版本控制、测试及和其他开发工具一起使用等,实际上要开发 DApp,使用 Truffle、Ganache、web3.js 来编译和部署合约比较方便和专业些更适合开发人员。
开发环境
Remix是一个网站http://remix.ethereum.org,开发者可以直接在线使用:
如果编译报错mock compiler:source not found的话可以使用另一个地址:
https://ethereum.github.io/browser-solidity/#optimize=false&version=soljson-v0.4.23+commit.124ca40d.js
编译
点击Remix也没左上角的加号按钮新建一个合约文件MyToken.sol
pragma solidity ^0.4.0;
contract MyToken { /* This creates an array with all balances */ mapping (address => uint256) public balanceOf;
/* Initializes contract with initial supply tokens to the creator of the contract */ function MyToken(uint256 initialSupply) public { balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens }
/* Send coins */ function transfer(address _to, uint256 _value) public { require(balanceOf[msg.sender] >= _value); // Check if the sender has enough require(balanceOf[_to] + _value >= balanceOf[_to]);
// Check for overflows balanceOf[msg.sender] -= _value; // Subtract from the sender balanceOf[_to] += _value; // Add the same to the recipient } } |
这个是Ethereum 官网有提供一个最小可执行的代币合约,MyToken 合约真的只能做两件事
- 创建代币:发起合约时创建指定数量的代币,代币拥有者是发起合约的 Ethereum 帐户
- 转移代币:转移指定数量的代币到指定的 Ethereum 帐户
合约文件创建完成后点击Remix也没右上角的编译按钮,忽略告警的话就已经编译成功。
运行
编译成功后,在Remix页面右上角选择Run标签, 首先选择环境,选择 JavaScript VM 代表所有资料都是存在本地(功能类似 testrpc)。它会提供 5 个虚拟账户每个有 100 ETH:
接着选择MyToken合约,输入初始值(发行的代币数目),创然后点击Create来部署合约:
控制台可以看到运行日志:
合约部署成功后,可以看到合约的使用界面。Remix 会自动根据合约的內容,产生对应的合约使用界面。可以看到合约有两个功能:balanceOf(查询余额) 和 transfer(转移代币)。
部署合约的时候初始化1000代币,对应的地址是在环境选择的账户,查询余额:
选择另一个账户进行转移代币:
在输入框输入地址和代币数:"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db", 10
同时转移成功后查询余额:
在执行操作的时候可以在控制台看到日志:
因为合约的执行是需要消耗Gas的,所以可以看到账户的以太币会减少:
参考
- http://wiki.jikexueyuan.com/project/solidity-zh/introduction.html
- http://baijiahao.baidu.com/s?id=1598229422200506116&wfr=spider&for=pc