智能合约开发环境搭建及Hello World合约

如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇。
就先学习任何编程语言一样,入门的第一个程序都是Hello World。今天我们来一步一步从搭建以太坊智能合约开发环境开始,讲解智能合约的Hello World如何编写。

开发环境搭建

Solidity安装

强烈建议新手使用Browser-Solidity来进行开发。
Browser-Solidity是一个基于浏览器的Solidity,就可以不用安装Solidity,本文的Hello World教程也将基于Browser-Solidity来进行。

如果你想自己安装请参考Solidity安装指引。

geth 安装

Mac下安装命令如下:其他平台参考:geth官方安装指引

brew tap ethereum/ethereum
brew install ethereum

brew 是 Mac 下的包管理工具,和Ubuntu里的apt-get类似

安装完以后,就是把geth控制台启动。

启动环境

在入门篇讲过,geth是一个以太坊客户端,现在利用geth启动一个以太坊(开发者)网络节点。

geth --datadir testNet --dev console 2>> test.log

执行命名后,会进入geth控制台,这时光标停在一个向右的箭头处,像这样:
在这里插入图片描述

命令参数说明:

–dev 启用开发者网络(模式),开发者网络会使用POA共识,默认预分配一个开发者账户并且会自动开启挖矿。
–datadir 后面的参数是区块数据及秘钥存放目录。 第一次输入命令后,它会放在当前目录下新建一个testNet目录来存放数据。
console 2>> test.log 表示把控制台日志输出到test.log文件

为了更好的理解,建议新开一个命令行终端,实时显示日志:

tail -f test.log

准备账户

部署智能合约需要一个外部账户,我们先来看看分配的开发者账户,在控制台使用以下命令查看账户:

eth.accounts

回车后,返回一个账户数组,里面有一个默认账户,如:

eth.accounts
[“0x1cc5442859135775d638639424319ac0d6ce476f”]

也可以使用personal.listAccounts查看账户,

再来看一下账户里的余额,使用一下命令:

eth.getBalance(eth.accounts[0])

eth.accounts[0]表示账户列表第一个账户
回车后,可以看到大量的余额,如:

eth.getBalance(eth.accounts[0])
1.15792089237316195423570985008687907853269984665640564039455904007913129975221e+77

开发者账户因余额太多,如果用这个账户来部署合约时会无法看到余额变化,为了更好的体验完整的过程,这里选择创建一个新的账户。

创建账户

使用以下命令创建账户:

personal.newAccount("Password")

Password为新账户的密码,回车后,返回一个新账户。

这时我们查看账户列表:

eth.accounts

可以看到账户数组你包含两个账户,新账户在第二个(索引为1)位置。

现在看看账户的余额:

eth.getBalance(eth.accounts[1])
0

回车后,返回的是0,新账户是0。结果如:
在这里插入图片描述

给新账户转账

我们知道没有余额的账户是没法部署合约的,那我们就从默认账户转1.68以太币给新账户,使用以下命令(请使用你自己eth.accounts对应输出的账户):

eth.sendTransaction({from: '0x1cc5442859135775d638639424319ac0d6ce476f', to: '0xab578890e11ae26aef83da8deb6e11ed19cab99b', value: web3.toWei(1.68, "ether")})

在打开的tail -f test.log日志终端里,可以同时看到挖矿记录
再次查看新账户余额,可以新账户有1.68个以太币

解锁账户

在部署合约前需要先解锁账户(就像银行转账要输入密码一样),使用以下命令:

personal.unlockAccount(eth.accounts[1],"Password");

“Password” 是之前创建账户时的密码
解锁成功后,账户就准备完毕啦,接下来就是编写合约代码。

编写合约代码

现在我们来开始编写第一个智能合约代码,solidity代码如下:

pragma solidity ^0.4.2;
contract hello {
    string greeting;
    
    function hello(string _greeting) public {
        greeting = _greeting;
    }

    function say() constant public returns (string) {
        return greeting;
    }
}

在编写完成代码,IDE进行编译时会出现错误,注意要选择正确的编译器版本,如图:
在这里插入图片描述

简单解释下,我们定义了一个名为hello的合约,在合约初始化时保存了一个字符串(我们会传入hello world),每次调用say返回字符串。
把这段代码写(拷贝)到Browser-Solidity,如果没有错误,点击Details获取部署代码,如:
在这里插入图片描述

在弹出的对话框中找到WEB3DEPLOY部分,点拷贝,粘贴到编辑器后,修改初始化字符串为hello world。
image

solidity在博文写作时(2017/11/24),版本为0.4.2,solidity发展非常快,solidity版本之间有可能不能兼容,这是你可以在Browser-Solidity的Settings里选择对应的编译器版本。
Browser-Solidity也不停的更新中,截图可能和你看到的界面不一样。

部署合约

Browser-Solidity生成的代码,拷贝到编辑器里修改后的代码如下:

var _greeting = "Hello World";
var helloContract = web3.eth.contract([{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function","stateMutability":"view"},{"inputs":[{"name":"_greeting","type":"string"}],"type":"constructor","payable":true,"stateMutability":"payable"}]);
var hello = helloContract.new(
   _greeting,
   {
     from: web3.eth.accounts[2], 
     data: '0x6060604052604051610250380380610250833981016040528080518201919060200150505b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10607157805160ff1916838001178555609f565b82800160010185558215609f579182015b82811115609e5782518260005055916020019190600101906082565b5b50905060c6919060aa565b8082111560c2576000818150600090555060010160aa565b5090565b50505b50610178806100d86000396000f360606040526000357c010000000000000000000000000000000000000000000000000000000090048063954ab4b21461003c57610037565b610002565b346100025761004e60048050506100bc565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f1680156100ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b602060405190810160405280600081526020015060006000508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156101695780601f1061013e57610100808354040283529160200191610169565b820191906000526020600020905b81548152906001019060200180831161014c57829003601f168201915b50505050509050610175565b9056', 
     gas: '4700000'
   }, function (e, contract){
    console.log(e, contract);
    if (typeof contract.address !== 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

第1行:修改字符串为Hello World
第2行:修改合约变量名
第3行:修改合约实例变量名,之后可以直接用实例调用函数。
第6行:修改部署账户为新账户索引,即使用新账户来部署合约。
第8行:准备付的gas费用,IDE已经帮我们预估好了。
第9行:设置部署回调函数。

拷贝回geth控制台里,回车后,看到输出如:

Contract mined! address: 0x79544078dcd9d560ec3f6eff0af42a9fc84c7d19
transactionHash:
0xe2caab22102e93434888a0b8013a7ae7e804b132e4a8bfd2318356f6cf0480b3

说明合约已经部署成功。

在打开的tail -f test.log日志终端里,可以同时看到挖矿记录

现在我们查看下新账户的余额:

eth.getBalance(eth.accounts[1])
是不是比之前转账的余额少呀!

运行合约

hello.say()
“Hello World”
输出Hello World,我们第一个合约Hello World,成功运行了。

原始链接:https://learnblockchain.cn/2017/11/24/init-env/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值