以太坊学习(4)开发编译部署调用智能合约
来源:互联网 发布:keygen注册机下载 mac 编辑:程序博客网 时间:2024/06/05 02:38
本文根据汪晓明的视频资料整理,ubuntu16.04测试正确。
1.打开geth控制台
~$ geth --datadir ~/pengfan/eth --dev
在另一个终端输入
~$ geth --dev console 2>>file_to_log_output
2.查看、设置编译器
> eth.getCompilers()[]
设置solc为编译器
> admin.setSolc("/usr/local/bin/solc")Error: exit status 1 at web3.js:3119:20 at web3.js:6023:15 at web3.js:4995:36 at <anonymous>:1:1
提示错误,更改路径成“/usr/bin/solc”
~$ whereis solcsolc: /usr/bin/solc /usr/local/bin/solc> admin.setSolc("/usr/bin/solc")"solc, the solidity compiler commandline interface\nVersion: 0.4.7+commit.822622cf.Linux.g++\n"
再次查看
>eth.getCompilers()["Solidity"]
3.编写智能合约
>source="contract test { function multiply(uint a) returns(uint d) { return a * 7; }}"
4.编译智能合约
> contract = eth.compile.solidity(source).test
code——编译后的EVM字节码
info——编译器返回的原数据
abiDefinition——应用程序二进制接口定义
compilerOptions——编译参数
5.准备工作:创建账户并激活
在以太坊上创建智能合约就是使用一个外部账户(EOA)向区块链中发送一个交易。
> personal.newAccount("123456")"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"> personal.listAccounts["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"]> eth.getBalance(personal.listAccounts[0])0> miner.start()true> eth.blockNumber2> eth.getBalance(personal.listAccounts[0])15000000000000000000> address=eth.accounts[0]"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"> personal.unlockAccount(address,"123456",10000)true
6.指定创建合约的账户
> address=eth.accounts[0]"0x733bf98c0e218b430db0fe1d4c9ef04341444a82"
7.部署合约
部署合约就是将编译好的合约字节码以外部账号发送交易到一个空地址的形式部署到以太坊区块链上
> abi=contract.info.abiDefinition
8.
web3.eth.contract可以创建一个合约对象,这个对象可以在指定地址上初始化一个合约:
> MyContract=eth.contract(abi){ abi: [{ constant: false, inputs: [{...}], name: "multiply", outputs: [{...}], payable: false, type: "function" }], eth: { accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"], blockNumber: 14, coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82", compile: { lll: function(), serpent: function(), solidity: function() }, defaultAccount: undefined, defaultBlock: "latest", gasPrice: 20000000000, hashrate: 41253, mining: true, pendingTransactions: [], syncing: false, call: function(), contract: function(abi), estimateGas: function(), filter: function(fil, callback), getAccounts: function(callback), getBalance: function(), getBlock: function(), getBlockNumber: function(callback), getBlockTransactionCount: function(), getBlockUncleCount: function(), getCode: function(), getCoinbase: function(callback), getCompilers: function(), getGasPrice: function(callback), getHashrate: function(callback), getMining: function(callback), getNatSpec: function(), getPendingTransactions: function(callback), getRawTransaction: function(), getRawTransactionFromBlock: function(), getStorageAt: function(), getSyncing: function(callback), getTransaction: function(), getTransactionCount: function(), getTransactionFromBlock: function(), getTransactionReceipt: function(), getUncle: function(), getWork: function(), iban: function(iban), icapNamereg: function(), isSyncing: function(callback), namereg: function(), resend: function(), sendIBANTransaction: function(), sendRawTransaction: function(), sendTransaction: function(), sign: function(), signTransaction: function(), submitTransaction: function(), submitWork: function() }, at: function(address, callback), getData: function(), new: function()}
9.将合约部署到区块链上
>myContract=MyContract.new({from:address,data:contract.code}){ abi: [{ constant: false, inputs: [{...}], name: "multiply", outputs: [{...}], payable: false, type: "function" }], address: undefined, transactionHash: "0xc99efdc9ffb6f8283556b5de80c76f9bb3b37faf62bb8374ddf79480257866ac"}
10.检查交易池,有一个待处理事项,要通过挖矿让交易生效,红色框中说明交易已经发送到区块链中了,等待矿工确认。
> txpool.status{ pending: 1, queued: 0}
> txpool.status{ pending: 0, queued: 0}> miner.stop()true
11.合约写进区块链之后就可以调用了(合约交互),以下为合约调用代码,通过abi取合约对象
使用eth.contract来定义一个合约类,定义的合约类遵从ABI定义
> Multiply7=eth.contract(contract.info.abiDefinition){ abi: [{ constant: false, inputs: [{...}], name: "multiply", outputs: [{...}], payable: false, type: "function" }], eth: { accounts: ["0x733bf98c0e218b430db0fe1d4c9ef04341444a82"], blockNumber: 24, coinbase: "0x733bf98c0e218b430db0fe1d4c9ef04341444a82", compile: { lll: function(), serpent: function(), solidity: function() }, defaultAccount: undefined, defaultBlock: "latest", gasPrice: 20000000000, hashrate: 0, mining: false, pendingTransactions: [], syncing: false, call: function(), contract: function(abi), estimateGas: function(), filter: function(fil, callback), getAccounts: function(callback), getBalance: function(), getBlock: function(), getBlockNumber: function(callback), getBlockTransactionCount: function(), getBlockUncleCount: function(), getCode: function(), getCoinbase: function(callback), getCompilers: function(), getGasPrice: function(callback), getHashrate: function(callback), getMining: function(callback), getNatSpec: function(), getPendingTransactions: function(callback), getRawTransaction: function(), getRawTransactionFromBlock: function(), getStorageAt: function(), getSyncing: function(callback), getTransaction: function(), getTransactionCount: function(), getTransactionFromBlock: function(), getTransactionReceipt: function(), getUncle: function(), getWork: function(), iban: function(iban), icapNamereg: function(), isSyncing: function(callback), namereg: function(), resend: function(), sendIBANTransaction: function(), sendRawTransaction: function(), sendTransaction: function(), sign: function(), signTransaction: function(), submitTransaction: function(), submitWork: function() }, at: function(address, callback), getData: function(), new: function()}
12.指定特定地址,得到该地址上的合约实例
> myMultiply7=Multiply7.at(myContract.address){ abi: [{ constant: false, inputs: [{...}], name: "multiply", outputs: [{...}], payable: false, type: "function" }], address: "0x8bd328e25b6846e01dd855123374fb285454cf0a", transactionHash: null, allEvents: function(), multiply: function()}
在实例中能够调用的函数有两个:allEvents和multiply。multiply显然是一开始我们定义合约的时候写的函数。我们可以使用两种方法来调用multiply函数:sendTransaction(3, {from: address})和call(3)。
> myMultiply7.multiply.sendTransaction(3, {from:address})"0x71eed110365e80fb4d9436c30f5480fb5522afa629f629be816d4b07ef8d7c83"> myMultiply7.multiply.call(3)21> myMultiply7.multiply.call(8)56
使用sendTransaction(3, {from: address})返回的值为一个字符串,这个字符串代表的是发送的交易的hash值。使用这个方法调用合约将会使调用的结果成为全局共识的一部分
使用call(3)这个方法调用合约只会在本地上运行
要改变合约状态,只能用第一种方法。
- 以太坊学习(4)开发编译部署调用智能合约
- 开发部署一个智能合约(以太坊-Ethereum)
- 如何开发编译部署调用智能合约
- 以太坊之部署智能合约
- 以太坊智能合约部署与交互
- 区块链开发(二)部署和运行第一个以太坊智能合约
- 区块链开发(二)部署和运行第一个以太坊智能合约
- 区块链开发(二)部署和运行第一个以太坊智能合约
- 开发智能合约的注意事项(以太坊-Ethereum)
- 以太坊私有链搭建及智能合约部署与调用
- 搭建以太坊私有链和部署智能合约开发环境
- 【区块链学习】以Windows为例,通过以太坊钱包部署和运行智能合约
- 以太坊私有链环境下智能合约部署流程
- 【区块链】以太坊私有链下智能合约部署
- 以太坊智能合约solidity
- 【智能合约】以太坊中智能合约调用中用的gas相关概念详解
- 以太坊智能合约开发环境及总结
- 以太坊代币如何开发智能合约的奥秘
- 因子分析原理PPT
- java迭代器应用 源码探究
- C++中不能声明为虚函数的有哪些函数
- 关于 CheckBox 你或许不知道的一些知识点
- 【android学习】android与H5互相调用
- 以太坊学习(4)开发编译部署调用智能合约
- k近邻法与kd树
- Codeforces 353C Find Maximum【贪心】
- 系数求和问题(模拟)
- JavaWeb 过滤器的使用
- 逻辑回归优缺点
- 关于php -fpm 出现127.0.0.1:9000已经被占用
- 79 leetcode - Merge Sorted Array
- Java 类的方法总结