最近在学习区块链相关的东西,需要用到智能合约,所以在此做一些笔记,以此为以后用到了做一些帮助。
经过最近一周的研究,自己各种百度,基于当前的区块链知识的水平,个人把智能合约大体分为以下部署方式
1 智能合约geth 命令端 部署
2 rpc 接口进行部署
3 前端 web3.js基于node环境 进行部署
计划使用三篇文章进行记录。
此篇为 geth 命令端 部署
打开remix编辑 不管是线上还是本地搭建的
- 创建 Test.sol
pragma solidity ^0.4.22;
contract Multiply7 {
event Print(uint);
function multiply(uint a) public returns(uint d) {
emit Print(a * 7);
return a * 7;
}
}
- 选择对应的版本 version ,编译成功后点击 details,如下图:
-
复制上图中的WEB3DEPLOY
-
geth attach ipc:对应目录/geth.ipc
进入命令端: eth 查看是否创建过账号并具有对应的eth数量 # eth.getBalance(eth.accounts[0]) # miner.start(1) //没有余额进行挖矿,,有则不用 # miner.stop() //经过一段时间挖矿,有一定eth后 # personal.unlockAccount(eth.accounts[0]) //解锁用户,将用该用户部署智能合约 # var multiply7Contract = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"Print","type":"event"}]); # var multiply7 = multiply7Contract.new( { from: web3.eth.accounts[0], data: '0x608060405234801561001057600080fd5b5060f58061001f6000396000f300608060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b348015604f57600080fd5b50606c600480360381019080803590602001909291905050506082565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a723058206ca12caf3900e028861fda3e55ae13df64b1e21df372c79588e6695c7f67b86c0029', gas: '4700000' }, function (e, contract){ console.log(e, contract); if (typeof contract.address !== 'undefined') { console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash); } }) //粘贴刚才图中所示的web3的内容 //回车 查看日志 Submitted contract creation fullhash=0xef836cce365c6bb53c7936da117e333c2498a0ff31e4b5cab5d65511a3310c88 contract=0x41a6e2855829396E1387598CB65aaf76FFA1662d //会看到日志中有以上信息,说明智能合约部署了,但是还没有写入区块中 # miner.start(1) //进行挖矿,这里是挖矿,把刚才部署的合约写入区块中 null # Contract mined! Address: 0x3d21428a20aa5c51e7ab1dfc52c89c2c337924e6 //合约地址 [object Object] # eth.getCode('0x3d21428a20aa5c51e7ab1dfc52c89c2c337924e6') //查看是否部署成功 "0x60806040526004361061005c576000357c010000000000000000000000000000000000000000000000000000000090048063188b85b41461006157806360fe47b1146100b05780636d4ce63c146100eb578063f446c1d014610116575b600080fd5b34801561006d57600080fd5b5061009a6004803603602081101561008457600080fd5b8101908080359060200190929190505050610141565b6040518082815260200191505060405180910390f35b3480156100bc57600080fd5b506100e9600480360360208110156100d357600080fd5b810190808035906020019092919050505061014f565b005b3480156100f757600080fd5b50610100610159565b6040518082815260200191505060405180910390f35b34801561012257600080fd5b5061012b610162565b6040518082815260200191505060405180910390f35b600081600054019050919050565b8060008190555050565b60008054905090565b6000548156fea165627a7a723058203033498bf3661ba9be9645b58fc484ca960635e7cabc7879bda415d4e13094170029" # miner.stop() //通过日志,发现已经挖矿成功
- 调用合约方法
# contractInstance.multiply.sendTransaction(9, {from:eth.accounts[0], gas:1000000}) "0x6a2b0d2a5d4175519610e681853e823aa401a0295c10b4be7fb7e2358f8f59d0" 9
**ps 总节: 通过以上步骤,智能合约已经部署完成了,但是其中定义的实例化对象 contractInstance 在我关闭geth客户端,再一次进入后,无法使用了,智能通过之前记录的abi 进行再次实例化,才能进行智能合约方法的调用 **
abi 就是 上面提到的json数据
# var abi = web3.eth.contract([{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"","type":"uint256"}],"name":"Print","type":"event"}]);
# abi.at("合约地址").get() //通过这样才能调用刚才部署的合约