ethereum钱包交易

前面一篇已经把私有链部署起来,如果要开发创新创新场景的应用,一般是需要后台智能合约及前端展示,作为大众用户,一般不会去关心后台啥啥的,也不会去下载个什么专业的桌面钱包来管理“合约”相关交易,并且现在一般手机应用也是混合居多,所以我们现在就直接基于JS把Web前端开发做个示例。后台智能合约开发后续再详细讲下。

链服务端

要直接操作以太坊链,服务端需要启动一个链的节点,并开放RPC端口供客户端调用,开启命令为进入geth

[bath]admin.startRPC( ‘192.168.226.88’,’8545′,’*’)[/bath]

web3.js

以太坊区块链 提供了jason的数据交互格式及httprpc 的访问协议供前端应用的开发,并且封装到了web3.js.

步骤

1.加载初始化web3.js,并连接到后端rpc端口地址

1) 引入依赖
<script type="text/javascript" src=".../web3.min.js"></script>

2) 创建实例
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

2.使用web3使用各个接口进行交易操作

  • 同步调用
    var balance = web3.eth.getBalance(address);
  • 异步回调
    web3.eth.getBalance(address, function(error, result){...});

4) 批量调用
var batch = web3.createBatch(); batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback)); batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2)); batch.execute();

web3.js 接口用法详见https://github.com/ethereum/wiki/wiki/JavaScript-API

web3.js 主要针对区块链交易等,而还有一个js库ethereumjs-wallet提供钱包功能,如果要做在线钱包功能可以使用该库。

 

该地址提供了ethereum 不同JS功能相关库信息资料http://ethereumjs.github.io/

ethereum私有链部署

本篇主要给开发人员阅读,要了解以太坊,区块链等概念基本知识,网络上搜索下就好。本篇进行私有链部署,当然你也可以直接在以太坊的测试链上进行,就省去私有链部署过程。

工具

我们需要如下客户端:

geth(以太坊节点客户端):

通过geth可以加入一个以太坊链,也可以建立一个自己的私有链然后加入。

mist(依托geth的图形化钱包管理客户端):

可在钱包中进行账户管理及合约操作并测试

链元数据(创世块)

新建一个文件genesis.json内容如下:

{ "alloc": { "bd2d69e3e68e1ab3944a865b3e566ca5c48740da": { "balance": "4000000000000000000000000000000" }, "ca9f427df31a1f5862968fad1fe98c0a9ee068c4": { "balance": "5000000000000000000000000000000" } }, "nonce": "0x0000000000000042", "difficulty": "0x060000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "missummerwillenyuan", "gasLimit": "0x4c4b40" }

 

参数

描述

mixhash

与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。

nonce

nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。

difficulty

设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度

alloc

用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。

coinbase

矿工的账号,随便填

timestamp

设置创世块的时间戳

parentHash

上一个区块的hash值,因为是创世块,所以这个值是0

extraData

附加信息,随便填,可以填你的个性信息

gasLimit

该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

步骤

1.使用命令行通过geth 设置创世区块及区块链保存目录

[bath]geth –datadir “C:\Users\zhouwr\AppData\Roaming\Ethereum\willenchain” init genesis.json [/bath]

2.通过geth 启动该区块链

[bath]geth –identity “willenetherum” –rpc –rpccorsdomain “*” –datadir “C:\Users\zhouwr\AppData\Roaming\Ethereum\willenchain” –port “30303” –rpcapi “db,eth,net,web3″ –networkid 95518 console[/bath]

上面的步骤一个区块链已经创建成功,那么我们加入账号使用他们

账号

添加账号,当然测试用,我们就把创始分配有以太币的账号加进来

[bath]geth –datadir “C:\Users\zhouwr\AppData\Roaming\Ethereum\willenchain”  account import ca9f427df31a1f5862968fad1fe98c0a9ee068c4.key[/bath]

使用如下脚本查看账号

[bath]geth -datadir “C:\Users\zhouwr\AppData\Roaming\Ethereum\willenchain” account list[/bath]

或者启动区块链后使用如下命令查看账号:

[bath]eth.accounts[/bath]

当然同时我们可以使用图形化钱包来查看账号

参数

描述

identity

区块链的标示,随便填写,用于标示目前网络的名字

init

指定创世块文件的位置,并创建初始块

datadir

设置当前区块链网络数据存放的位置

port

网络监听端口

rpc

启动rpc通信,可以进行智能合约的部署和调试

rpcapi

设置允许连接的rpc的客户端,一般为db,eth,net,web3

networkid

设置当前区块链的网络ID,用于区分不同的网络,是一个数字

console

启动命令行模式,可以在Geth中执行命令

nodiscover

禁止被网络中其它节点发现,需要手动添加该节点到网络

verbosity

打印详细的日志信息

图型化钱包及交易

可以启动钱包Ethereum-Wallet-win64-0-8-5了,我们可以看到有个主账户并有好多ether,现在我们在钱包中新建一个账户,然后主账户转账1000ether给新建的账户,输入密码之后我们看到状态是确认中,那么我们需要在geth的命令行界面启动挖矿命令:miner.start(),将该笔交易记录到区块中,因为我们设置的挖矿难度很低,所以开启后看到挖出几个区块之后我们要停止挖矿,miner.stop(),不然会浪费好多区块,再回到图形化钱包,我们已经看到新账户已经到账ether 了。

网络

使用VirtualBox创建以太windows 7虚拟机,然后重复第一个节点的创建步骤在虚拟机上部署geth和以太坊钱包,同样需要初始化文件hdgenesis.json(同一个文件拷贝一份),并运行初始化命令,然后再运行启动命令,启动之后运行admin.nodeInfo.enode命令获取新节点的enode信息,然后在第一个节点上运行 admin.addPeer(enode URL)来添加新节点,注意将enode URL中[::]替换为新节点的IP地址,添加成功后运行admin.peers命令即可查看对等节点信息。

至此,一套基于geth的本地简单私有网络创建完成,可以在这套环境上进行简单的智能合约创建和测试。

智能合约

基本上,现今我们的应用创新场景有如下可行的:

底层创新:基本上是区块链算法上的创新,如修改一下共识机制之类的创新。

平台创新:Baas,区块链即服务,就是能够帮助企业快速部署一条私有链,将链作为服务提供给需要的企业。

场景创新:再一条固定的以太坊区块链上,将可行的应用场景引入进来,解决一些问题,比如信息保密需求,工作量确认并不可抵赖等需求场景,然后根据场景建模数字化成响应的智能合约,就创建了不同场景的应用,解决了问题,提供人们服务。

我觉得个人可以尝试的就是场景创新,虽然这个门框比较低,但是抓住历史机会也是会成功的,因为过了一段时间再看,虽然技术门槛是低,但是进入时间恰当的话,经过时间积累,会形成其他壁垒,如用户习惯,服务质量,大众效应。

 

部署使用过程参考https://my.oschina.net/stevex/blog/746669

protobuf(-)安装使用

protobuf 是一个二进制的接口数据结构,或者称为序列化格式 or接口描述语言。类比于json这种文本型的接口序列化格式,跨语言平台。优点是小巧,结构统一,缺点是通讯中的可读性稍差。

原理

跨平台,protobuf的接口写一处,可以到处执行。作为一个接口描述性语言,将接口定义在.proto后缀的文件里,然后通过编译器protoc 将该文件翻译成各种语言版本的接口。具体.proto 编写规范见后续文件。支持java,c++等几乎全部语言,go语言稍微特殊,除需要protoc 编译器外,还需要专门的一个go插件,protoc-go-gen.

安装protoc

下载protoc,地址https://github.com/google/protobuf/releases,里面可以找到win/linux/mac的二进制文件, 我们需要protoc-3.0.0-win32.zip或者protoc-3.0.0-linux-x86_64.zip,把里面的protoc.exe(其它文件不需要)拷贝到可行路径PATH下面OR把protoc.exe所在路径加入到PATH中。

protoc-go-gen

安装好go运行环境后,git环境,直接编译protoc-gen-go,会在GOPATH/BIN目录下,将其也拷贝到protoc.exe所在目录OR PATH目录。

go get -u github.com/golang/protobuf/protoc-gen-go

编译

对于已经写好的.proto接口文件,需要用protoc 编译成相应语言才能使用。编译命令说明如下:

Usage: protoc [OPTION] PROTO_FILES
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --javanano_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto

可选内容详见—help。

示例:

protoc --go_out=./go/ ./proto/helloworld.proto

grpc与protobuf

grpc与protobuf同出一门,google,两者结合可认为是当前最佳实践。那么要应用grpc于protobuf编译,需要增加proto工具,

go get -u github.com/golang/protobuf/proto

同时使用protoc 编译的时候需要增加如下显示参数来生成grpc的接口客户端与服务端文件。

protoc --go_out=plugins=grpc:. *.proto