1.准备一个已编写的合约:
——该合约是用solidity语言编写
pragma solidity ^0.4.0; contract test { function multiply(uint a) returns(uint d) { return a * 7; } }
- 编译合约
想要部署合约需要得到合约代码的ABI和EVM code。
一个编译合约的在线编译网站:
http://chriseth.github.io/browser-solidity/#version=soljson-latest.js
图中Bytecode和interface就是我们需要的结果。
- 部署合约
在部署合约前,我们要明确需要以下几项条件:
一个有币的账户;
该账户已解锁;
编译合约得到的abi(interface)和code(bytecode)。
//定义abi
>abi=[{constant:false,inputs:[{name:'a',type:'uint256'}],name:'multiply',outputs:[{name:'d',type:'uint256'}],type:'function'}]
//创建合约
>multiplyContract = web3.eth.contract(abi)
//解锁账户
>personal.unlockAccount(eth.coinbase, '123', 10000)
第一个参数是账户地址.
第二个参数:账户密码.
第三个参数:账户解锁持续的时间, 以毫秒为单位
//部署合约。data为上述编译得到的Bytecode
>multiply=multiplyContract.new({from:eth.coinbase,data:"0x60606040523415600b57fe5b5b60788061001a6000396000f300606060405263ffffffff60e060020a600035041663c6888fa181146020575bfe5b3415602757fe5b60306004356042565b60408051918252519081900360200190f35b600781025b9190505600a165627a7a7230582007a6259ba3d57941abda2e261e9a67958a3eda78b779d9dd8d42518791fddd590029"})
//我们知道部署合约的过程实际也是由创建合约的账户发送的一笔交易(即eth.coinbase账户)。需要挖矿进行确认。
>miner.start(4);admin.sleepBlocks(2);miner.stop();
- 与合约交互
//获取合约对象
>MyContract = eth.contract(abi)
//实例化合约
>myContract = MyContract.at(multiply.address)
//调用合约
>myContract.multiply.call(5)