以太坊智能合约学习笔记1
最近在学习智能合约,记录下学习笔记
环境
以太坊的智能合约是使用Solidity
编程语言,所以首先需要搭建相关的环境
- 以太坊
使用golang开发的客户端geth
: https://github.com/ethereum/go-ethereum
相关命令:
1 | $ geth account list # 列出以太坊账号 |
下面举例使用Ropsten测试网络:
1 | $ screen -S geth |
- solc编译器
geth最新版已经移除了solc编译器,所以需要我们自己在本地安装一个:
1 | $ npm install -g solc |
编译出abi:
1 | $ solcjs --abi -o output test.sol |
如果有导入第三方库:
1 | $ cat test.sol |
- IDE
ide使用的是remix-ide,可以使用在线版的: http://remix.ethereum.org/
也可以本地自己搭一个:
1 | $ npm install -g remix-ide |
- 以太坊数据查询
公链数据查询: https://etherscan.io/
Ropsten测试链: https://ropsten.etherscan.io/
其他查询网站: https://www.etherchain.org/
以太坊/区块链基础知识
在以太坊中任何操作(转账,部署合约,调用合约函数)都是以交易的形式存在,每进行一次交易,都会加入pending列表中,同步给其他节点,当有一个节点挖出了一个区块,将会把pending列表中的所以交易打包
1 | > eth.blockNumber |
在以太坊中,重要的有三个地址,个人账户地址,合约地址,交易地址
1 | # 获取交易地址信息 |
不管是个人账户还是合约地址,都能储存以太币余额,两者的区别是,个人账户地址的所有者具有该地址的公私钥,能进行签名,所以能向任意个人/合约地址转账,而合约地址不具有公私钥,所以如果一个合约不具有转账的函数,这个合约将会成为一个黑洞,以太币只能存进行,但任何人都没法取出来
个人账户和合约地址还有一个区别,合约地址能储存数据,个人账户不行:
1 | > eth.getCode("0xd2bb24e348651970e0a3ae50ea89e5ff2b37c09b") # 个人账户地址 |
智能合约会被转换成字节码储存在区块中, 但是在https://etherscan.io/网站中,一些智能合约能查看源码,这是由于合约发布者在该网站主动公布了源码,否则我们只能获取到字节码,所以智能合约的反编译也是一个有必要的工作
在以太坊中,基本单位是Wei,我们可以使用下面的函数将其和ether进行转换:
1 | > web3.toWei(1) |
通过命令行控制智能合约
测试代码:
1 | pragma solidity ^0.4.24; |
使用remix-ide在ropsten测试链上进行部署,得到合约地址: 0x22BAf676C25fB4a9462a6f3571769Ad98Ce6B2Cb
在ide上获取该合约的abi,去掉回车:
1 | >>> abi.replace("\n", "").replace("\t", "") |
然后在geth命令行进行操作:
1 | abi = [{"constant": false,"inputs": [],"name": "test1","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "nonpayable","type": "function"},{"payable": true,"stateMutability": "payable","type": "fallback"},{"inputs": [],"payable": false,"stateMutability": "nonpayable","type": "constructor"},{"constant": true,"inputs": [],"name": "owner","outputs": [{"name": "","type": "address"}],"payable": false,"stateMutability": "view","type": "function"},{"constant": true,"inputs": [],"name": "value","outputs": [{"name": "","type": "uint256"}],"payable": false,"stateMutability": "view","type": "function"}] |
然后我们可以对该合约进行操作:
1 | > test.owner() # 部署人的地址 |
因为调用函数需要消耗gas,所以需要指定是哪个账号调用该合约函数,在web3js中调用函数的参数分别是,该函数本身需要的参数,以太坊相关信息参数(一个字典),回调函数
以太坊相关信息参数字典:
1 | { |
向智能合约转账触发回退函数:
1 | > test.value() |
因为该合约没有写转账代码,所以这0.5以太币就永远待在这个合约当中了,不过因为是在测试链中,所以舍得~
以太坊智能合约学习笔记1