区块链(1)开发环境搭建及Hello World合约展示

区块链(1)开发环境搭建及Hello World合约展示
区块链(2)以太坊开发框架Truffle教程(Windows)
区块链(3):在以太坊私有链建立节点集群并发生交易

开发环境搭建

如果你对于以太坊智能合约开发还没有概念,请先阅读以太坊智能合约入门,本文基于windows平台开发。

Geth 安装

以太坊的客户端有很多,我们选择开发过程中最为流行的Geth,其基于Go语言开发。
官方地址下载相应的安装包,双击安装即可。如果你没有梯子,那就前这里Geth国内镜像地址

以太坊钱包安装

以太坊有好多钱包程序,我们选择以太坊基金会主推的MistMist官方地址Mist的目标是成为一个DAPP的浏览器和应用市场,目前还在开发当中,我们使用其专门为以太坊开发的特殊版本Ethereum WalletEthereum Wallet 官方下载地址
下载Ethereum Wallet,安装版本或者压缩版本,安装或者解压缩即可。

Solidity编译环境安装

以太坊智能合约的编程语言也是不止一种,其中以Solidity最为流行,它是一种语法类JavaScript的语言,用其编写的智能合约需要编译成以太坊字节码,运行在以太坊虚拟机EVM上。
作为入门教程,我们使用Browser-Solidity 来进行开发。Browser-Solidity是一个基于浏览器的Solidity,就可以不用安装Solidity。
如果想了解Solidity的安装,可以参考Solidity安装指引

通过以上3步,简单的开发环境就安装完成了,接下来我们就来开发自己的第一个智能合约。

启动开发环境

在智能合约开发阶段我们可以选择多种方式运行我们的智能合约,此处选择建立自己的私有链作为测试环境来开发、调试和测试智能合约。

  1. 准备创世块文件
    配置自己的创世块是为了区分公有链,同一个网络中,创世块必须是一样的,否则无法联通。
    geth.exe 相同的目录下新建genesis.json文件,如下图所示
    创世块文件位置
    文件内容如下

    {
    "nonce":"0x0000000000000042",
    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x4000",
    "alloc": {},
    "coinbase":"0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x",
    "gasLimit":"0xffffffff",
    "config": {}
    }

    解释一下各个参数的作用:

参数名 含义
nonce nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash
difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以
coinbase 一个160-bit地址,矿工账户,在创世纪块中可以为任意值,后期会随着挖矿及交易而改变
timestamp 创世块的时间戳
parentHash 一个区块的hash值,因为是创世块,所以这个值是0
extraData 附加信息
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大
config 暂时不知道什么意思

2. 创建数据存放地址并初始化创世块
打开命令行窗口,进入geth.exe 的目录下,输入geth --datadir "%cd%\chain" init genesis.json,回车。
以上命名表示在geth.exe的目录下创建了chain数据存放路径并初始化创世块。
3. 启动区块链中的节点
在控制台中输入以下命令并回车
geth --identity "shusheng007eth" --rpc --rpccorsdomain "*" --datadir "%cd%\chain" --port "30303" --rpcapi "db,eth,net,web3" --rpcaddr "你本机ip" --rpcport "8545" --networkid 95518 console
当看到如下图所示就说明成了
启动区块链节点成功结果展示
4. 创建外部账户
可以使用命令eth.accounts来查看当前账户列表
账户列表
如图所示,我电脑中存在两个账户,如果没有账户可以使用
personal.newAccount("shusheng007")
命令来创建账户,“shusheng07”是账户密码。
5. 挖矿
使用如下命令就可以知道第一个账户里面的以太坊数目。
> eth.getBalance(eth.accounts[0])
使用如下命令开始挖矿,括号里面的1表示使用一个cpu
> miner.start(1)
使用如下命令停止挖矿
> miner.stop()
下面命令表示以3个cup来挖矿,挖到以第一区块后就停止挖矿。如果括号里面什么都不写则表示用全部cup来挖矿
miner.start(3); admin.sleepBlocks(1); miner.stop();
6. 解锁账户
在部署合约前需要先解锁账户(就像银行转账要输入密码一样)
使用如下命令
> personal.unlockAccount(eth.accounts[0],"wang")
第一参数为要解锁的账户,第二个参数为此账户密码
解锁成功后发回true

编写智能合约

1.打开Browser-Solidity,如下图所示
这里写图片描述
新建一个helloWorld.sol文件,在编辑区输入代码

pragma solidity ^0.4.19;
contract hello {
    string greeting;

    function hello(string _greeting) public {
        greeting = _greeting;
    }

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

2.点击detail获取部署代码,如下图
这里写图片描述
3.在弹出的对话框中找到WEB3DEPLOY部分,点拷贝粘贴到你的文本编辑器(例如notepad++)后,修改初始化字符串为“hello world”。
这里写图片描述

修改后的文本

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

将上面这段代码拷贝到命令行中回车,出现类似如下的结果说明合约部署成功了

Contract mined! address: 0xfb5a6c98e1d3da35165348749cb91522094c7e8f transactionH
ash: 0x2342d48a7d1f49d87d6a0ff31e87a030a6f1d807f963f664e1bde99372198cf2

如果你出现了

INFO [02-08|15:21:14] Submitted contract creation             
fullhash=0x2342d48a7d1f49d87d6a0ff31e87a030a6f1d807f963f664e1bde99372198cf2 contract=0xFB5A6c98e1
D3dA35165348749Cb91522094c7E8f
null [object Object]
undefined

说明区块链中没有任何矿工挖矿,没有人帮你把合约写入区块链中,只要使用命名miner.start(1)开始挖矿,一会合约就部署成功了。

运行智能合约

在命令行中输入
> hello.say()
就会得到执行结果”hello world”。

参考文章如下:
智能合约开发环境搭建及Hello World合约
区块链开发(一)搭建基于以太坊的私有链环境

猜你喜欢

转载自blog.csdn.net/shusheng0007/article/details/79288519