配置geth并启动

参考 http://tn.51cto.com/article/515


使用智能合约

本文介绍使用Geth客户端搭建测试用的本地区块链,以及如何在链上部署和调用智能合约。

搭建测试用区块链

对于开发者开发测试场景,可以选择本地搭建一条测试链。

开发好的智能合约可以快速地切换接口部署到公有链上。

测试链不同于以太坊公链,需要一些非默认的手动配置。

1. 配置初始状态

首先配置私有区块链网络的初始状态

格式化JSON:

{

        "config": {

                "chainId": 22,

                "homesteadBlock": 0,

                "eip155Block": 0,

                "eip158Block": 0

        },

        "alloc": { },

        "coinbase": "0x0000000000000000000000000000000000000000",

        "difficulty": "0x400",

        "extraData": "",

        "gasLimit": "0x2fefd8",

        "nonce": "0x0000000000000038",

        "mixhash": "0x0000000000000000000000000000000000000000000000000 000000000000000",

        "parentHash": "0x0000000000000000000000000000000000000000000000000 000000000000000",

        "timestamp": "0x00"

}

chainId : 指定了独立的区块链网络ID,不同ID网络的节点无法互相连接。

配置文件当前挖矿难度difficulty、区块Gas消耗限制gasLimit等参数进行了设置。

2.启动区块链

用以下命令初始化区块链,生成创世区块和初始状态:

$ geth --datadir privchain init genesis.json

--datadir指定区块链数据的存储位置,可自行选择一个目录地址。

用以下命令启动节点,并进入Geth命令行界面:

$ sudo geth --identity "TestNode" --rpc --rpcport "8545" --datadir /usr/local/blockchain/geth/privchain/ --port "30303" --nodiscover console

各选项的含义如下:

·--identity:指定节点ID;

·--rpc:表示开启HTTP-RPC服务;

·--rpcport:指定HTTP-RPC服务监听端口号(默认为8545);

·--datadir:指定区块链数据的存储位置;

·--port:指定和其他节点连接所用的端口号(默认为30303);

·--nodiscover:关闭节点发现机制,防止加入有同样初始配置的陌生节点。

3.创建账号

用上述geth console命令进入的命令行界面采用JavaScript语法。

可以用以下命令新建一个账号:

> personal.newAccount()

Passphrase:

Repeat passphrase:

"0x9606d8441257bb85f10c005243200c4e1d8757b3"


可以用以下命令查看该账号余额:

>myAddress = "0x9606d8441257bb85f10c005243200c4e1d8757b3" >eth.getBalance(myAddress)

0

看到该账号当前余额为0。

可用

miner.start() 命令进行挖矿。

miner.stop() 命令可以停止挖矿。

创建和编译智能合约

以Solidity编写的智能合约为例。

为了将合约代码编译为EVM二进制,需要安装Solidity编译器solc:

$ apt-get install solc

新建一个Solidity智能合约文件,命名为testContract.sol,

该合约包含一个方法multiply,作用是将输入的整数乘以7后输出,

代码如下:

pragma solidity ^0.4.0;

contract testContract {

    function multiply(uint a) returns(uint d) {

        d = a * 7;

    }

}

用solc获得合约编译后的EVM二进制码:$ solc --bin testContract.sol

======= testContract.sol:testContract =======

Binary:

6060604052341561000c57fe5b5b60a58061001b6000396000f30060606040526000357c0 100000000000000000000000000000000000000000000000000000000900463ffffff ff168063c6888fa114603a575bfe5b3415604157fe5b6055600480803590602001909 1905050606b565b6040518082815260200191505060405180910390f35b6000600782 0290505b9190505600a165627a7a72305820748467daab52f2f1a63180df2c4926f34 31a2aa82dcdfbcbde5e7d036742a94b0029

再用solc获得合约的JSON ABI(Application Binary Interface),其中指定了合约接口,包括可调用的合约方法、变量、事件等:

$ solc --abi testContract.sol

======= testContract.sol:testContract =======

Contract JSON ABI [{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name":"mul- tiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"type": "function"}]

下面回到Geth的JavaScript环境命令行界面,用变量记录上述两个值。

注意在code前加上0x前缀:

>code = "0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260

043610603f576000357c0100000000000000000000000000000000000000000000000000

000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606

260048080359060200190919050506078565b6040518082815260200191505060405180

910390f35b60006007820290509190505600a165627a7a723058201aa91f8575d4f143bd4

b3e377831a2e68b19bdb863189791f06bb9e0835860c00029"

>abi = [{"constant":false,"inputs":[{"name":"a","type":"uint256"}],"name": "multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false, "type":"function"}]

部署智能合约

在Geth的JavaScript环境命令行界面,

首先用以下命令解锁自己的账户,否则无法发送交易:

>personal.unlockAccount(myAddress)

Unlock account 0x1b6eaa5c016af9a3d7549c8679966311183f129e

Passphrase:

true

接下来发送部署合约的交易:

>myContract = eth.contract(abi)

>contract = myContract.new({from:myAddress,data:code,gas:1000000})

如果此时没有在挖矿,用txpool.status命令可看到本地交易池中有一个待确认的交易。

可用以下命令查看当前待确认的交易:>eth.getBlock("pending",true).transactions

[{ blockHash: "0xbf0619ca48d9e3cc27cd0ab0b433a49a2b1bed90ab57c0357071b 033aca1f2cf", blockNumber: 17, from: "0x1b6eaa5c016af9a3d7549c8679966311183f129e", gas: 90000, gasPrice: 20000000000, hash: "0xa019c2e5367b3ad2bbfa427b046ab65c81ce2590672a512cc973b84610eee53e", input: "0x6060604052341561000c57fe5b5b60a58061001b6000396000f30060606 040526000357c0100000000000000000000000000000000000000000000000000 000000900463ffffffff168063c6888fa114603a575bfe5b3415604157fe5b605 56004808035906020019091905050606b565b6040518082815260200191505060 405180910390f35b60006007820290505b9190505600a165627a7a72305820748 467daab52f2f1a63180df2c4926f3431a2aa82dcdfbcbde5e7d036742a94b0029", nonce: 1, r: "0xbcb2ba94f45dfb900a0533be3c2c603c2b358774e5fe89f3344031b202995a41", s: "0x5f55fb1f76aa11953e12746bc2d19fbea6aeb1b9f9f1c53a2eefab7058515d99", to: null, transactionIndex: 0, v: "0x4f", value: 0 }]

可以用miner.start()命令挖矿,一段时间后,交易会被确认,即随新区块进入区块链。

调用智能合约

用以下命令可以发送交易,其中sendTransaction方法的前几个参数与合约中multiply方法的输入参数对应。

这种方式下,交易会通过挖矿记录到区块链中,如果涉及状态改变也会获得全网共识:

>contract.multiply.sendTransaction(10, {from:myAddress})

如果只是想本地运行该方法查看返回结果,可采用如下方式获取结果:

>contract.multiply.call(10)

70

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容