主要函数
kill
:selfdestruct 是 ethereum 智能合约自带的自毁程序,kill对此方法进行了封装,只有合约的拥有者才可以调用该方法;greet
:返回合约 greeter 里的 greeting属性的值;
代码运行分析
第一步 生成智能合约代码对象
我们先把合约代码smartContract_example01.sol 压缩为一行.新建一个ssh session, 切换到geth用户环境su - geth
, 然后输入:cat smartContract_example01.sol | tr 'n' ' '
. 切换到以太坊控制台,把合约代码保存为一个变量:
var greeterSource = 'contract mortal { address owner; function mortal() { owner = msg.sender; } function kill() { if (msg.sender == owner) selfdestruct(owner); } } contract greeter is mortal { string greeting; function greeter(string _greeting) public { greeting = _greeting; } function greet() constant returns (string) { return greeting; } }'
第二步 编译合约代码
然后编译合约代码:
代码语言:javascript复制var greeterCompiled = web3.eth.compile.solidity(greeterSource)
greeterCompiled.Token.code
可以看到编译好的二进制代码 greeterCompiled.Token.info.abiDefinition
可以看到合约的ABI
第三步 设置希望返回的字符串
代码语言:javascript复制var _greeting = "Hello World!"
第四步 部署合约
接下来我们要把编译好的合约部署到网络上去.
首先我们用ABI来创建一个javascript环境中的合约对象:
代码语言:javascript复制var greeterContract = web3.eth.contract(greeterCompiled.greeter.info.abiDefinition);
我们通过合约对象来部署合约:
代码语言:javascript复制var greeter = greeterContract.new(_greeting,{from:web3.eth.accounts[0], data: greeterCompiled.greeter.code, gas: 300000}, function(e, contract){
if(!e) {
if(!contract.address) {
console.log("Contract transaction send: TransactionHash: " contract.transactionHash " waiting to be mined...");
} else {
console.log("Contract mined! Address: " contract.address);
console.log(contract);
}
}
})
- greeterContract.new方法的第一个参数设置了这个新合约的构造函数初始化的值
- greeterContract.new方法的第二个参数设置了这个新合约的创建者地址from, 这个新合约的代码data, 和用于创建新合约的费用gas.gas是一个估计值,只要比所需要的gas多就可以 ,合约创建完成后剩下的gas会退还给合约创建者.
- greeterContract.new方法的第三个参数设置了一个回调函数,可以告诉我们部署是否成功.