以太坊作为区块链2.0技术的代表,与比特币最大的不同就在于其图灵完备性,可以编写智能合约。今天,就在以太坊上写一个简单的Solidity程序,来了解下智能合约的开发环境。
准备知识
-
以太坊本地客户端geth
上一篇已经讲解了geth的本地编译和基本使用。
-
Solidity编程语言
基于以太坊的智能合约使用一种类似于JS的叫Solidity的编程语言编写,文件扩展名为.sol。它也是以太坊官方推荐的编程语言。
-
EVM运行环境
上面说到Solidity类似于JavaScript,它的运行环境是EVM(Ethereum Virtual Machine),以太坊虚拟机。EVM运行在以太坊节点上。
-
编译IDE
EVM运行的是智能合约的字节码,所以在部署智能合约之前需要编译。之前以太坊提供的IDE叫Mix(现在已经停止维护),现在使用的是一个网页形式呈现的编译器,叫ReMix。
我们运行Solidity程序时,需要将Solidity拷贝到代码区然后编译执行。当然,我们也可以下载一个离线版的ReMix到本地。
-
合约部署
智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户。
以太坊中有两类账户:- 外部账户
该类账户被私钥控制(由人控制),没有关联任何代码。 - 合约账户
该类账户被它们的合约代码控制且有代码与之关联。和比特币使用UTXO的设计不一样,以太坊使用更为简单的账户概念。
两类账户对于EVM来说是一样的。外部账户与合约账户的区别和关系是这样的:一个外部账户可以通过创建和用自己的私钥来对交易进行签名,来发送消息给另一个外部账户或合约账户。
在两个外部账户之间传送消息是价值转移的过程。但从外部账户到合约账户的消息会激活合约账户的代码,允许它执行各种动作(比如转移代币,写入内部存储,挖出一个新代币,执行一些运算,创建一个新的合约等等)。
只有当外部账户发出指令时,合同账户才会执行相应的操作。
合约部署就是将编译好的合约字节码通过外部账号发送交易的形式部署到以太坊区块链上(由实际矿工出块之后,才真正部署成功)。 - 外部账户
-
合约运行
合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了。
撸起袖子就是干
1.准备以太坊账户
//1.从测试网络启动一个以太坊网络节点
geth --datadir testNet --dev console 2>> test.log
//2.查看账户,系统会有一个默认的账户
eth.accounts
//3.查看余额,由于是测试网络 默认账户会有大量的余额
eth.getBalance(eth.accounts[0])
//4.创建新账户,用户密码为chaors 可以用2查看
personal.newAccount("chaors")
//5.给新用户转账 从一个地址转给另一个地址9个以太币
eth.sendTransaction({from:'0x4ca5da2d66d9bf9074bd2fd097f468d92cd15d17',to:'0x67588df863e337e78b290cb77809197de1b2fc38',value:web3.toWei(9,"ether")})
//6.部署合约前需要对账户进行解锁
personal.unlockAccount(eth.accounts[1], "chaors")
2.编写HelloWorld合约代码
pragma solidity ^0.4.23; //solidity版本
contract helloWorld { //helloWorld合约
string hello; //字符串变量
function hi(string _hello) public {
hello = _hello;
}
function say() constant public returns (string) {
return hello;
}
}
编译得到WEB3DEPLOY代码(JS脚本)
复制的JS代码为:
var helloworldContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hello","type":"string"}],"name":"hi","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]);
var helloworld = helloworldContract.new(
{
from: web3.eth.accounts[0],
data: '0x608060405234801561001057600080fd5b506102d7806100206000396000f30060806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063954ab4b214610051578063f186264d146100e1575b600080fd5b34801561005d57600080fd5b5061006661014a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100a657808201518184015260208101905061008b565b50505050905090810190601f1680156100d35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156100ed57600080fd5b50610148600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506101ec565b005b606060008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101e25780601f106101b7576101008083540402835291602001916101e2565b820191906000526020600020905b8154815290600101906020018083116101c557829003601f168201915b5050505050905090565b8060009080519060200190610202929190610206565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061024757805160ff1916838001178555610275565b82800160010185558215610275579182015b82811115610274578251825591602001919060010190610259565b5b5090506102829190610286565b5090565b6102a891905b808211156102a457600081600090555060010161028c565b5090565b905600a165627a7a7230582056e01e9d4d42bc4cefefd88238c2506481e8352b31b1cbe58662a291251c45c00029',
gas: '4700000'
}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
}
});
3.合约部署
将复制的JS代码拷贝到geth JS控制台,直接回车:
4.查看helloword合约
这样,我们通过一个很简单的solidity代码了解了智能合约的开发和部署流程。实际开发总体也就是这几步,后面会详细地做一些智能合约的开发案例。
问题
-
这个helloworld的怎么输出一个字符串呢???
.
.
.
.
互联网颠覆世界,区块链颠覆互联网!
--------------------------------------------------20180425 23:17