2019-07-31 16:06:18 m0_37964218 阅读数 44

操纵系统:ubuntu 16.04 64位

 

安装Go语言环境

一.更新服务器源

apt-get update

 

二.安装Go语言包

1.下载安装包

curl -O https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz

 

2.下载完成后,解压至/usc/local目录下

tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz

 

三.配置Go语言环境变量

1.在.bashrc文件底部加上如下两条Go语言环境变量

vim ~/.bashrc

 

export GOPATH=/usr/local/GO

export PATH=$GOPATH/bin:$PATH

 

2.使环境变量生效,查看版本号后没问题,说明配置成功。

source ~/.bashrc

go version

 

参考链接: http://www.cnblogs.com/X-knight/p/9522511.html

 

安装geth

一.启动板存储库

apt install software-properties-common

add-apt-repository -y ppa:ethereum/ethereum

 

二.安装Go Ethereum的稳定版本

apt-get update

apt-get install ethereum

 

参考链接:https://blog.csdn.net/niekai01/article/details/65679843

 

创建你的genesis文件(可以参考下面链接的1.3步骤)

puppeth

 

devnet

 

2

 

1

 

这两个地址需要新开一个当前服务器连接窗口通过命令获取,可以参考下面链接的1.2步骤

geth --datadir . account new

 

红色区域为获取到的账户文件存放位置,可自行修改地址

 

1515  (请指定您的链/网络ID,不要使用1到10之间的任何东西)

 

2

 

2

 

genesis.json

 

ctrl + c 退出puppeth

 

下图为完整操作步骤

 

 

参考链接

https://hackernoon.com/setup-your-own-private-proof-of-authority-ethereum-network-with-geth-9a0a3750cda8

 

执行命令创建区块运行节点

一.创建块数据和钱包文件目录

mkdir /data

mv genesis.json /data/

 

二.执行命令,制造区块(geth的参数项目很多,可以geth –help 来获得详细信息)

geth --datadir /data/ init /data/genesis.json

 

三.执行一条最简单的geth命令,来创建自己的私有链条,需要先开个screen运行,因为一旦服务器连接退出程序也就中止了。

nohup geth --datadir /data/ --nodiscover --rpc --rpcapi net,eth,web3,personal --rpcaddr 0.0.0.0 --networkid 1515 > geth.log 2>&1 &  (后台运行)

geth attach /data/geth.ipc

exit (退出)

ps -aux|grep geth (kill geth进程)

 

四.创建账户,因为默认是没有账户的,我们可以用eth.accounts 查看,创建账户是为了下面挖矿准备地址。

personal.newAccount("xxxx")    xxx换成自己想输入的密码即可

 

五.开始挖矿(4为挖矿线程数),我们可以看到区块在增长

miner.start(4)

 

eth.blockNumber

 

web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')   查看挖矿收益,默认收益为第一个地址,可以通过miner.setEtherbase(address) 指定收益地址

 

eth.coinbase 挖矿收益地址

 

eth.accounts查看所有用户

 

 

六.我们用top可以看到cpu已经开始挖矿了

top

 

七.在我们刚才第三步指定了日志文件为/data/geth.log,日志显示正常提交。

tail -f /data/geth.log

 

参考链接:https://blog.csdn.net/niekai01/article/details/65679843

 

搭建第二个节点与第一个节点进行同步

1.安装go语言环境

2.安装geth

3.将第一个节点的genises文件拷贝到第二个节点

4.执行命令创建区块,运行节点

admin.nodeInfo.enode    在第二个节点执行

 

admin.addPeer("enode://ea5556fdc67937a67c3a03182721cb7dd618c0499933ba1bd0e9c840c71e7fd40a1812f404ee46c8d0cfee582edaddc2107f6eb3045385ba4b70c8ab642fd0b0@47.52.166.216:30303?discport=0")

在第一个节点输入admin.addPeer(第二个节点的返回结果),将ip改为第二个节点的ip

 

net.peerCount   查看连接,正常我们可以从一号和二号节点分别看到一个连接

 

admin.peers  可以查看连接到的节点详情

 

eth.blockNumber  可以看到两个节点块数据一致

 

以上步骤为ETH私有链搭建所有流程,命令不懂的可以直接百度ETH常用命令即可

 

2018-01-17 19:59:24 sinat_34070003 阅读数 2181

搭建基于以太坊的私有链环境

    

    通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私有链进行区块链开发测试,本文基于以太坊技术进行搭建,分两个部分,一个是Ubuntu下搭建方法,另一个是Windwos下搭建方法, 

一、   Ubuntu下安装Geth客户端

    之所以采用Ubuntu,是因为以太坊的官方对Ubuntu支持的很好,是在各个linux系统中安装最简单。

    Geth官方安装指南:

    https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum

    进入ubuntu命令行,执行如下命令 

sudo apt-get update

sudo apt-get installsoftware-properties-common

sudo add-apt-repository -yppa:ethereum/ethereum

sudo add-apt-repository -yppa:ethereum/ethereum-dev

sudo apt-get update

sudo apt-get install ethereum

    系统联网执行后,即完成了安装以太坊客户端,其中包括geth,bootnode, evm, disasm, rlpdump,ethtest

    此时如果输入Geth命令,会出现启动以太坊启动的画面

 二、       安装Windows下Geth客户端

    Windows必须64位系统,从官方网站下载编译好的win64客户端,解压缩即可运行,下载地址如下:

    https://github.com/ethereum/go-ethereum/releases/

    下载后,只有一个Geth.exe的文件。

    安装图像化客户端Mist,依然是从官方地址下载编译好的客户端即可,下载地址:

    https://github.com/ethereum/mist/releases/

    下载解压缩后,Ethereum-Wallet即为以太坊图形化界面。

 

三、       准备创世块文件

    配置自己的创世块是为了区分公有链,同一个网络中,创世块必须是一样的,否则无法联通,此方法在windows和Ubuntu下通用。

    新建文件piccgenesis.json,输入如下内容并保存

{

    "nonce":"0x0000000000000042",

    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",

    "difficulty": "0x4000",

    "alloc": {},

    "coinbase":"0x0000000000000000000000000000000000000000",

    "timestamp": "0x00",

    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",

    "extraData": "0x888",

    "gasLimit":"0xffffffff"

}

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

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

附加信息,随便填,可以填你的个性信息 ,如果最新的geth初始化可能会提示要求以0x开头,可以填入"0x00" 或 “0x123888"等。

gasLimit

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

 四、       启动私有链节点

    启动Geth即可以启动以太坊的区块链,为了构建私有链 ,需要在Geth启动时加入一些参数,Geth参数含义如下: 

identity

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

init

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

datadir

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

port

网络监听端口

rpc

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

rpcapi

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

networkid

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

console

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

 

1、  在Ubuntu启动区块链节点

    在Ubuntu下,首先切换到打算运行的目录,目录下应该有配置好的piccgenesis.json文件,执行如下命令

basepath=$(cd `dirname $0`; pwd)

获取当前的目录

geth  --datadir "$basepath/chain" init piccgenesis.json 

创建数据存放地址并初始化创世块

geth --identity "0x888"  --rpc  --rpccorsdomain "*" --datadir "$basepath/chain" --port "30303"  --rpcapi "db,eth,net,web3"--networkid 95518 console

    启动后界面如下,光标停留在最后的命令行上,可以执行以太坊命令。

I0707 00:45:43.680087 ethdb/database.go:82]Alloted 128MB cache and 1024 file handles to /home/lihe/桌面/chain/chaindata

I0707 00:45:43.726008ethdb/database.go:169] closed db:/home/lihe/桌面/chain/chaindata

I0707 00:45:43.728913 ethdb/database.go:82]Alloted 128MB cache and 1024 file handles to /home/lihe/桌面/chain/chaindata

I0707 00:45:43.908795 ethdb/database.go:82]Alloted 16MB cache and 16 file handles to /home/lihe/桌面/chain/dapp

I0707 00:45:43.969506 core/genesis.go:92]Genesis block already in chain. Writing canonical number

I0707 00:45:43.980337 eth/backend.go:274]Successfully wrote custom genesis block:6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660

I0707 00:45:43.980618 eth/backend.go:184]Protocol Versions: [63 62], Network Id: 95518

I0707 00:45:43.981567core/blockchain.go:204] Last header: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.981645core/blockchain.go:205] Last block: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.981677core/blockchain.go:206] Fast block: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.985253 p2p/server.go:313]Starting Server

I0707 00:45:45.834488p2p/discover/udp.go:217] Listening,enode://134881790e54c803955715e3661c27f91caaf499be813e29c9f986e2eac62d47e02b13a8e51776c1caea554655614ed26ce0185d84e626da7ac48a83a60113ff@[::]:30303

I0707 00:45:45.835853 node/node.go:366]HTTP endpoint opened: http://localhost:8545

I0707 00:45:45.848008 p2p/server.go:556]Listening on [::]:30303

I0707 00:45:45.849731 node/node.go:296] IPCendpoint opened: /home/lihe/桌面/chain/geth.ipc

Welcome to the Geth JavaScript console!

 

instance:Geth/v1.5.0-unstable/linux/go1.5.1/PICCetherum

coinbase:0x93509a2f4b2b974b07ef0b52e07c3992601f5de1

at block: 81 (Tue, 05 Jul 2016 21:02:25CST)

 datadir: /home/lihe/桌面/chain

 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

    可以看到Listening on [::]:30303和Welcome to the Geth JavaScript console!的提示,说明已经启动成功

    注意:如果想将Ubuntu作为永久区块链节点使用,当使用nohup命令时,Geth启动参数console必须去掉,否则Geth会自动停止。

 

2、  在windows启动区块链节点

    进入Windows下Geth的目录 ,放置配置好的piccgenesis.json文件,执行如下命令:

geth  --datadir "%cd%\chain" init piccgenesis.json 

创建数据存放地址并初始化创世块

geth--identity "0x888" --rpc--rpccorsdomain "*" --datadir "%cd%\chain" --port"30303"  --rpcapi"db,eth,net,web3" --networkid 95518 console

    当看到Listening on [::]:30303和Welcome to the Geth JavaScript console!的提示,说明已经启动成功

 

五、       使用节点创建账号

    启动节点成功后,会进入Geth的命令行模式,输入如下命令

personal.newAccount()

    系统会提示你输入账号密码,并确认,最后会显示一个新生成的账号。

 六、       连接其他节点

    首先要知道自己的节点信息,在Geth命令行界面下输入命令,注意大小写

admin.nodeInfo

    系统会显示

 enode:"enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303“

    其中

enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303

    就是自己节点的信息,注意要把“0.0.0.0“换成你自己的IP。将这个信息发送给其他节点,在其他节点的命令行中输入:

admin.addPeer(‘enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@192.168.1.101:30303’)

    如果添加成功,输入admin.peers会显示出新添加的节点。

 

七、       使用节点进行挖矿

账号创建后,还没有以太币,需要在私有链上挖矿,切换到Geth界面,输入

miner.start(1)

        miner命令括号中的1表示用一个线程进行挖矿,如果不配置,就会让CPU全速运行,影响计算机的使用。

         运行一会后,主账号就会获取很多以太币,这个时候屏幕会快速刷屏,不用管,输入命令miner.stop()停止挖矿。

     到这一步,已经组建一个私有链的网络,可以像其他区块链一样不停的扩充这个网络,接下来,我会介绍如何在私有链上编写、调试和部署智能合约。

八、       在以太坊私有链上部署第一个智能合约

        本文的智能合约采用以太坊官方的示例合约,功能就是在区块链上存储一个数字,并能够读取出来。代码如下:

contract SimpleStorage {

    uint storedData;

    function set(uint x) {

        storedData = x;

    }

    function get() constant returns (uintretVal) {

        return storedData;

    }

}

        即使没有学过Solidity语言也可以大致看出,该合约set函数存储一个数字在X变量中,get函数从X变量中读取这个数字出来,下面对这个合约进行部署:

1、  启动私有链

   启动后界面如下, Ethereum-Wallet会显示红色的PRIVTE-NET标记。


2、创建两个钱包

        点击”ADD ACCOUNT” 按钮,添加一个钱包,程序会弹出一个对话框,提示输入两遍密码,输入完密码后,账号即创建成功。创建其他的账号,一样的操作,从上面的截图可以看到,有三个账号,一个是MAIN ACCOUNT,一个是ACCOUNT2,一个是ACCOUNT3

3、  将一个钱包的以太币转到另一个钱包中

        先点击ACCOUNT2账号,进入账号详情的界面,点击右侧的“COPY address”,把ACCOUNT2的地址拷贝下来,系统会提示你现在你处在一个测试网络,不要转入真正的以太币到这个账号。

        点击钱包中“SEND”按钮,从MAINACCOUNT给ACCOUNT2转入一定以太币,同时可以看到执行这笔交易的费用是0.00042个以太币。

     

    点击发送后会提示如输入密码,但这时还没有发送成功,根据区块链的交易规则,需要矿工的确认,并且每笔交易需要确认12个块,一个块是16秒的生成时间。切换到Geth程序,输入挖矿命令,直到ACCOUNT2上显示100个以太币,然后停止挖矿。

4、  部署智能合约

        点“CONTRACTS”,进入智能合约管理界面,点击“DEPOLY NEW CONTRACT”,开始部署智能合约,选择部署智能合约的账号,并输入智能合约的代码后,如下图

         输入完毕后点击“DEPLOY”,系统会提示输入账号密码,因为部署智能合约是需要费用的。

         

    这个时候是看不到部署的智能合约的,切换到Geth界面,进行挖矿,在12个块后,智能合约就能确认并显示出来。

九、       运行智能合约

1、 在本节点上运行智能合约

        点击“CONTRACTS”进入智能合约界面,可以看到刚才部署的智能合约“SimpleStorage”,点击进入该智能合约,进入详情界面,其中有智能合约写入区域和读取区域,首先启动Geth的挖矿,然后在写入区域选择相应的智能合约函数SET,在下面的数值输入框输入想设置的数值,运行一会后就可以在读取区域看到智能合约函数GET中Retval的返回值有变化。

         其他智能合约的运行也是一样,无非就是函数多点,输入多点。

 

2、 在其他节点上运行智能合约

        此时的智能合约只能自己能看到,别人是无法看到和运行的,如果其他人要运行你部署好的智能合约需要提供一些信息,就是其他教程中所说的智能合约的ABI和地址。

进入刚部署的“SimpleStorage”智能合约界面,右侧有四个按钮

A.“Deposit Eher”:向该智能合约发送以太币

B.“Copy address”:拷贝该智能合约的地址

C.“Show QR Code”:显示一个二维码,如果用手机扫描的话,显示该智能合约的地址

D.“Show Interface”:显示该智能合约的JSON接口,也就是ABI

        首先我们点“Copy address”,拷贝该智能合约的地址,然后点“Show Interface”将智能合约的JSON接口全部拷贝出来,在另一个需要运行智能合约的节点打开Ethereum-Wallet,打开“CONTRACTS”界面点击“WATCH CONTRACTS”添加一个智能合约。

        如上图所示,CONTRACT NAME随便填,CONTRACT ADDRESS填写智能合约地址,JSON INTERFACE填写刚才在”Show Interface “中拷贝的内容。点OK后,就可以看到这个智能合约并运行了。

十、       智能合约的部署原理

1、智能合约的部署架构

         本文介绍的智能合约的部署虽然是在图形化界面编译和执行,但其实最主要的是依赖于后台运行Geth的节点,此时Geth提供了一个RPC的接口向图形化界面的钱包提供区块链的信息。

RPC接口

         Geth在8545端口提供了JSON RPC API ,数据传输采用JSON格式,可以执行Web3库的各种命令,比如向前端,比如mist等图形化客户端提供区块链的信息,默认访问地址为http://localhost:8545

        我们部署一个智能合约时,首先Ethereum-Wallet调用SOLC智能合约编译器将代码编译成成EVM字节码,然后将EVM字节码通过Geth的RPC接口发送到以太坊网络,经过全网验证后,同时写入到每个Geth管理的区块链中,架构如下


         

2、 部署的数据流

       首先代码先经过SOLC编译变为了二进制码,然后通过一笔交易来创建智能合约,该笔交易包含了创建者账号、智能合约内容、智能合约的地址这几个关键信息,其中智能合约地址的生成是由创建者的账号和发送的交易数作为随机数输入,通过Kecca-256加密算法重新创建一个地址作为账号。


       部署过程中,需要通过交易来部署,同时数据要存储到区块链上,这些需要使用到GAS。

交易(Transactions)

        一笔交易是一条消息,从一个账户发送到另一个账户。交易可以包含二进制数据(payload)和以太币。

        如果目标账户包含代码,该代码和输入数据会被执行。

        如果目标账户是零账户(账户地址是0),交易将创建一个新合约。正如上文所讲,这个智能合约地址不是零地址,而是由合约创建者的地址和该地址发出过的交易数量计算得到。创建合约交易的payload被当作EVM字节码执行。执行的输出做为合约代码被永久存储。这意味着,为了创建一个合约,你不需要向合约发送真正的合约代码,而是发送能够返回可执行代码的代码。

Gas

        以太坊上的每笔交易都会被收取一定数量的gas,gas的目的是限制执行交易所需的工作量,同时为执行支付费用。当EVM执行智能合约时,gas将按照特定规则被逐渐消耗,其实GAS就是以太币的比较小的单位,如果以太币比作100元,那么GAS可以看作是1分钱。如果只有以太币,会有问题,以太币是需要大家买卖的,市场会有价格波动。可能会出现比特币这样的状况,一天跌50%涨50%。这个对计算的成本是不能接受的,例如今天做一个加法需要十块钱,明天做一个加法需要一百块钱。所以这里引入gas来解耦。把市场的波动和计算的开销来解耦,也就是说以太币和gas之间是有汇率的,以太币涨没关系,gas价格下降就可以了。它要保证我做同样的计算,消耗的法币是一致的。

        gas price(gas价格,以太币计)是由交易创建者设置的,发送账户需要预付的交易费用 = gas price * gas amount。 如果执行结束还有gas剩余,这些gas将被返还给发送账户。

        前文中曾经提到部署智能合约使用了0.00042个以太币,换算成gas就是21000gas

        无论执行到什么位置,一旦gas被耗尽(比如降为负值),将会触发一个out-of-gas异常。当前调用帧所做的所有状态修改都将被回滚。

十一、       智能合约的运行原理

        智能合约是部署在区块链的代码,区块链本身不能执行代码,代码的执行是在本地的EVM中,实际上,部署在区块链上代码是能够在本地产生原智能合约代码的代码,可以理解区块链为一个数据库,而客户端从数据库中读取了存储的运行代码,并在本地运行后,将结果写入到了区块链这个数据库中。


       本质上,以太坊的钱包也是智能合约的一个应用,以太坊搭建的是一个可供编写各种应用的平台。下一篇,将详细讲述智能合约的开发编写和调试方法



2018-03-14 16:30:30 u010330109 阅读数 8684

总结一下以太坊私有链搭建的过程,已经遇到的问题。

我们使用了LINUX,MAC OSX,WINDOWS三种平台,运行go-ethereum。

一、go语言安装

LINUX
1. 下载源码
https://github.com/golang/go

  1. 配置环境变量
命令行输入sudo gedit ~/.bashrc  
在打开的文件最后加上两行代码:

export GOPATH=/usr/local/go
export PATH=$GOPATH/bin:$PATH

命令行输入 source ~/.bashr  使配置生效
命令行输入 go version  验证配置是否成功

MAC OSX
http://blog.csdn.net/soindy/article/details/70239442

WINDOWS
https://studygolang.com/articles/7585

二、go-ethereum安装

MAC OSX

首先确保已安装 homebrew,没有安装过的可以在命令行下执
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 进行安装
brew tap ethereum/ethereum
brew install ethereum

WINDOWS

访问 https://geth.ethereum.org/downloads/
下载并安装 Geth for Windows

LINUX

git clone https://github.com/ethereum/go-ethereum
sudo apt-get install -y build-essential golang
cd go-ethereum
make geth

下面以linux为例:

在环境变量中添加

export PATH=PATH:/usr/local/ethernum/goethereum/build/bin:PATH

在命令行下输入 geth -h , 有如下显示表示成功
1521012260(1).png

三、创建节点和创世区块

以linux为例

  1. 编辑一个区块链文件 genesis.json
{
  "config": {
        "chainId": 109,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x10000",
  "extraData"  : "",
  "gasLimit"   : "0xffffff",
  "nonce"      : "0x0000000000000077",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}
  1. 创建节点

任意创建一个文件夹ethereumNode,在其中创建文件data1和data2

在ethereumNode文件下打开两个终端A,B

终端A中

对创世区块进行初始化,输入:

geth -datadir data1 init genesis.json

启动节点 端口号自行设定

参数说明
networkid 网络标识符
datadir 设置当前区块链网络数据存放的位置
console 启动命令行模式,可以在Geth中执行命令
ipcdisable 禁用IPC-RPC服务器

geth --networkid 123 --datadir data1 --ipcdisable --port 61910 --rpcport 8200 console

终端B中
对创世区块进行初始化,输入:

geth -datadir data1 init genesis.json

启动节点 修改文件夹data2 端口号修改

geth --networkid 123 --datadir data2 --ipcdisable --port 61911 --rpcport 8201 console

进入>命令行即为启动成功

四、连接节点

终端A的命令行中查看节点enode

>admin.nodeInfo.enode
"enode://2700fee9b8575b3a6df5146b192c74cc0a4eb832a8a3b95a80cc2a9aa73c7abb1a4cf2e734bb0228789611f86c95bcfe2654a187f3fa5ea58b49d245cf014e35@[::]:61910"

终端B的命令行中添加邻居

>admin.addPeer("enode://2700fee9b8575b3a6df5146b192c74cc0a4eb832a8a3b95a80cc2a9aa73c7abb1a4cf2e734bb0228789611f86c95bcfe2654a187f3fa5ea58b49d245cf014e35@[::]:61910")

在这里如果是多台机器之间的链接添加,需要将[::]改为对应机器的ip地址

终端A的命令行中查看邻居

admin.peers

1521013925(1).png

可以看到这里的id与终端B节点的的ip是相同的
同样,也可以在终端B中查看邻居,会得到节点B的信息
至此,两个节点就在一个区块链上连接成功

五、挖矿与交易

挖矿前要创建账户

创建新账号
personal.newAccount()
或者 personal.newAccount("123456")
挖矿
开始挖矿 miner.start(1)
停止挖矿 miner.stop()

挖矿一些时间我们可以查看产生了多少区块等信息

eth.blockNumber  查看区块数量
eth.getBlock(1) 通过区块号查看区块
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")

挖矿成功也会得到token

查看账户余额
eth.getBalance(eth.accounts[0])
或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")

发起交易前要解锁账户

解锁账号
personal.unlockAccount(eth.accounts[0])
使用账户资金前都需要先解锁账号

查看终端B的账户信息

eth.accounts[0]
"0xe4be4471c30c2552e14d1e26e8384db67b6d7e62"

在终端A中查看余额并转账

查看余额 单位是wei
> eth.getBalance(eth.accounts[0])
1000000000000000000

转账  0.5个ether
eth.sendTransaction({from:eth.accounts[0],to:"0xe4be4471c30c2552e14d1e26e8384db67b6d7e62",value:web3.toWei(0.5,"ether")})
使用 txpool.status 可以看到交易状态

挖矿确认交易
miner.start()
当有新的区块产生时停止挖矿
miner.stop()

查看节点B的余额,转账成功

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

查看节点A的余额,数量反而变多,因为使用节点A进行了挖矿

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

转载请注明出处

2017-01-05 18:15:53 ziyuzhiye 阅读数 2465
  区块链开发(一)搭建基于以太坊的私有链环境

    李赫 2016.07.08

    通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私有链进行区块链开发测试,本文基于以太坊技术进行搭建,分两个部分,一个是Ubuntu下搭建方法,另一个是Windwos下搭建方法,关于以太坊相关的基础知识,可以看我原先发表的一些文章,地址如下:    http://blog.csdn.net/sportshark

 

一、   Ubuntu下安装Geth客户端

    之所以采用Ubuntu,是因为以太坊的官方对Ubuntu支持的很好,是在各个Linux系统中安装最简单。

    Geth官方安装指南:

    https://github.com/ethereum/Go-ethereum/wiki/Building-Ethereum

    进入ubuntu命令行,执行如下命令

 

sudo apt-get update

sudo apt-get installsoftware-properties-common

sudo add-apt-repository -yppa:ethereum/ethereum

sudo add-apt-repository -yppa:ethereum/ethereum-dev

sudo apt-get update

sudo apt-get install ethereum

 

    系统联网执行后,即完成了安装以太坊客户端,其中包括geth,bootnode, evm, disasm, rlpdump,ethtest

    此时如果输入Geth命令,会出现启动以太坊启动的画面

 

二、       安装Windows下Geth客户端

    Windows必须64位系统,从官方网站下载编译好的win64客户端,解压缩即可运行,下载地址如下:

    https://github.com/ethereum/go-ethereum/releases/

    下载后,只有一个Geth.exe的文件。

    安装图像化客户端Mist,依然是从官方地址下载编译好的客户端即可,下载地址:

    https://github.com/ethereum/mist/releases/

    下载解压缩后,Ethereum-Wallet即为以太坊图形化界面。

 

三、       准备创世块文件

    配置自己的创世块是为了区分公有链,同一个网络中,创世块必须是一样的,否则无法联通,此方法在windows和Ubuntu下通用。

    新建文件piccgenesis.json,输入如下内容并保存

{

    "nonce":"0x0000000000000042",

    "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",

    "difficulty": "0x4000",

    "alloc": {},

    "coinbase":"0x0000000000000000000000000000000000000000",

    "timestamp": "0x00",

    "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",

    "extraData": "PICC GenesisBlock",

    "gasLimit":"0xffffffff"

}

 

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

 

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的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

 

四、       启动私有链节点

    启动Geth即可以启动以太坊的区块链,为了构建私有链 ,需要在Geth启动时加入一些参数,Geth参数含义如下: 

identity

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

init

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

datadir

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

port

网络监听端口

rpc

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

rpcapi

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

networkid

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

console

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

 

1、  在Ubuntu启动区块链节点

    在Ubuntu下,首先切换到打算运行的目录,目录下应该有配置好的piccgenesis.json文件,执行如下命令

basepath=$(cd `dirname $0`; pwd)

获取当前的目录

geth  --datadir "$basepath/chain" init piccgenesis.json 

创建数据存放地址并初始化创世块

geth --identity"PICCetherum"  --rpc  --rpccorsdomain "*" --datadir "$basepath/chain" --port "30303"  --rpcapi "db,eth,net,web3"--networkid 95518 console

    启动后界面如下,光标停留在最后的命令行上,可以执行以太坊命令。

I0707 00:45:43.680087 ethdb/database.go:82]Alloted 128MB cache and 1024 file handles to /home/lihe/桌面/chain/chaindata

I0707 00:45:43.726008ethdb/database.go:169] closed db:/home/lihe/桌面/chain/chaindata

I0707 00:45:43.728913 ethdb/database.go:82]Alloted 128MB cache and 1024 file handles to /home/lihe/桌面/chain/chaindata

I0707 00:45:43.908795 ethdb/database.go:82]Alloted 16MB cache and 16 file handles to /home/lihe/桌面/chain/dapp

I0707 00:45:43.969506 core/genesis.go:92]Genesis block already in chain. Writing canonical number

I0707 00:45:43.980337 eth/backend.go:274]Successfully wrote custom genesis block:6e92f8b23bcdfdf34dc813cfaf1d84b71beac80530506b5d63a2df10fe23a660

I0707 00:45:43.980618 eth/backend.go:184]Protocol Versions: [63 62], Network Id: 95518

I0707 00:45:43.981567core/blockchain.go:204] Last header: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.981645core/blockchain.go:205] Last block: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.981677core/blockchain.go:206] Fast block: #81 [6193c4b0…] TD=10836704

I0707 00:45:43.985253 p2p/server.go:313]Starting Server

I0707 00:45:45.834488p2p/discover/udp.go:217] Listening,enode://134881790e54c803955715e3661c27f91caaf499be813e29c9f986e2eac62d47e02b13a8e51776c1caea554655614ed26ce0185d84e626da7ac48a83a60113ff@[::]:30303

I0707 00:45:45.835853 node/node.go:366]HTTP endpoint opened: http://localhost:8545

I0707 00:45:45.848008 p2p/server.go:556]Listening on [::]:30303

I0707 00:45:45.849731 node/node.go:296] IPCendpoint opened: /home/lihe/桌面/chain/geth.ipc

Welcome to the Geth JavaScript console!

 

instance:Geth/v1.5.0-unstable/linux/go1.5.1/PICCetherum

coinbase:0x93509a2f4b2b974b07ef0b52e07c3992601f5de1

at block: 81 (Tue, 05 Jul 2016 21:02:25CST)

 datadir: /home/lihe/桌面/chain

 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

    可以看到Listening on [::]:30303和Welcome to the Geth JavaScript console!的提示,说明已经启动成功

    注意:如果想将Ubuntu作为永久区块链节点使用,当使用nohup命令时,Geth启动参数console必须去掉,否则Geth会自动停止。

 

2、  在windows启动区块链节点

    进入Windows下Geth的目录 ,放置配置好的piccgenesis.json文件,执行如下命令:

geth  --datadir "%cd%\chain" init piccgenesis.json 

创建数据存放地址并初始化创世块

geth--identity "PICCetherum" --rpc--rpccorsdomain "*" --datadir "%cd%\chain" --port"30303"  --rpcapi"db,eth,net,web3" --networkid 95518 console

    当看到Listening on [::]:30303和Welcome to the Geth JavaScript console!的提示,说明已经启动成功

 

五、       使用节点创建账号

    启动节点成功后,会进入Geth的命令行模式,输入如下命令

personal.newAccount()

    系统会提示你输入账号密码,并确认,最后会显示一个新生成的账号。

 

六、       启动Windows下私有链图形节点

    首先按上面的步骤启动Geth并创建了账号,然后解压缩Ethereum-Wallet,运行Ethereum-Wallet.exe,即启动成功,如果区块链正常的话,会在右上角显示“PRIVATE-NET”,点击“LAUNCH APPLICATION”进入图形界面即可。

 

七、       连接其他节点

    首先要知道自己的节点信息,在Geth命令行界面下输入命令,注意大小写

admin.nodeInfo

    系统会显示

  enode:"enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303“

    其中

enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@0.0.0.0:30303

    就是自己节点的信息,注意要把“0.0.0.0“换成你自己的IP。将这个信息发送给其他节点,在其他节点的命令行中输入:

admin.addPeer(‘enode://1e3c1727cd3bee9f25edeb5dbb3b880e03e41f8eec99566557f3ee0422734a8fcad17c161aa93d61bdbfb28ed152c143c7eb501db58bc63502a104a84b62d742@192.168.1.101:30303’)

    如果添加成功,输入admin.peers会显示出新添加的节点。

 

八、       使用节点进行挖矿

    在Geth命令行界面下,输入miner.start()即启动挖矿,挖矿后,会不停刷屏,输入miner.stop()即停止,不用管刷屏导致的命令不全,命令会正常执行。

     到这一步,已经组建一个私有链的网络,可以像其他区块链一样不停的扩充这个网络,下一篇文章,我会介绍如何在私有链上编写、调试和部署智能合约。

 参考文章:

1. http://tech.lab.carl.pro/kb/ethereum/testnet_setup

2. http://www.ethdocs.org/en/latest/network/test-networks.html#setting-up-a-local-private-testnet

3. https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network

4. https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console

5. https://github.com/ethereum/go-ethereum/wiki/Mining

6. https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts

7. https://github.com/janx/ethereum-bootstrap


转自:http://blog.csdn.net/sportshark/article/details/51855007

2019-10-04 22:45:01 BugOverseas 阅读数 89

2019/10/04

在4种语言编写的以太坊客户端(Geth、Eth、Pyethapp、EthereumJ),go语言实现的Geth( go-ethereum)是当前最被热捧,官方一直维护并推荐使用的客户端。这里简单介绍如何利用Geth(1.9.3)搭建本地私有链,并与以太坊钱包Mist连接,可视化进行操作。运行环境为Ubuntu 18.04。


安装geth
详见:以太坊客户端Geth的安装(ubuntu18.04)


安装Mist
Mist发行版本,找到合适的版本(博主这里是Mist-linux64-0-11-1.zip,另外注意,由于安全问题,服务团队其实已经在3月已经停止维护Mist,所以用来测试就好啦)。
下载后,unzip Mist-linux64-0-11-1.zip。之后找到./mist,直接运行。但是发现报错:关于libgconf2-4。那么sudo apt-get install libgconf2-4。在运行./mist,成功。

在这里插入图片描述


geth搭建私有链
可以执行geth --help查看相关命令。我们直接来:

  • 创建创世区块配置文件genesis.json,该文件文件内容如下:
   {                                                                                                                                    
      "config":{
           "chainId":15,
           "homesteadBlock":0,
           "eip155Block":0,
           "eip158Block":0
           },
      "alloc":{},
      "coinbase":"0x0000000000000000000000000000000000000000",
      "difficulty":"0x60000",
      "extraData":"0x0000111122223333",
      "gasLimit":"0xffffffff",
      "nonce":"0x0000000000000001",
      "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp":"0x00"
  }
参数名 描述
chainId 指定了独立的区块链网络 ID。网络 ID 在连接到其他节点的时候会用到,以太坊公网的网络 ID 是 1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络 ID。不同 ID 网络的节点无法相互连接。
HomesteadBlock 当设置为0表示使用Homestead发布该链。
eip155Block eip是ethereum improvement proposal的缩写,我们的链不会提议分叉,所以设置为“0”即可
eip158Block 同上
nonce nonce就是一个64位随机数,用于挖矿,注意它和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意它和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。
difficulty 设置设置当前区块的难度,越大挖矿就越难。
alloc 用来预置账号以及账号的以太币数量。
coinbase 矿工账号
timestamp 设置创世块的时间戳
parentHash 上一个区块的hash,创世块就为0
extraData 附加信息
gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和

上述参考:https://blog.csdn.net/m0_37847176/article/details/82983519

  • 初始化生成节点1(可能我们会需要多节点,所以先来个node1)
cd /home/aurora/bc/privateNet
geth --datadir node1 init genesis.json
  • 开启节点1
geth --datadir "./node1" --networkid 72 --nodiscover --port 3100
%若两个节点互联 则需指定networkid; 若加console则直接在下面进入交互界面,不好,因为日志信息会进行刷屏。可以重新打开一个窗口,然后`geth attach ipc:node1/geth.ipc` 

启动节点一之后我们进node1里面,会看到三个文件:geth.ipc(进程间通信)、keystore、geth。其中geth/chaindata存放区块数据,keysotre存放账户数据。
此时,我们可以进入console模式,进行操作,私有连理论上已经搭好。
console下的部分命令:

命令 描述
personal.newAccount() 创建账户;
personal.unlockAccount() 解锁账户;
eth.accounts 枚举系统中的账户;
eth.getBalance() 查看账户余额,返回值的单位是 Wei(Wei 是以太坊中最小货币面额单位,类似比特币中的聪,1 ether = 10^18 Wei);
eth.blockNumber 列出区块总数;
eth.getTransaction() 获取交易。EX: eth.sendTransaction({from : eth.accounts[1], to : “zskcndsjkncdskj”, value : web3.toWei(15, ‘ether’)})
eth.getBlock() 获取区块;
miner.start() 开始挖矿;
miner.stop() 停止挖矿;
web3.fromWei() Wei 换算成以太币;
web3.toWei() 以太币换算成 Wei;
txpool.status 交易池中的状:pending/queued
admin.addPeer() 连接到其他节点

部署合约部分命令,可参考:https://www.jianshu.com/p/9fa31e4cdf4d

更多命令可参考:https://github.com/ethereum/go-ethereum/wiki/Management-APIs
(以上均是基于console)


私有链连接Mist

  • 首先找到Mist的ipc(此前ctrl+c/d 关闭node1)
ps -ef|grep geth

在这里插入图片描述
/home/aurora/.ethereum/geth.ipc就是我们要找的.

  • 关闭Mist,启动node1
geth --datadir "./node1" --networkid 72 --nodiscover --port 30101 --ipcpath     /home/aurora/.ethereum/geth.ipc --rpc --rpcport 8545 --rpcaddr localhost  
%指定了ipc路径

并且在console里面输入如下:
在这里插入图片描述
建立三个用户

  • 重启打开Mist:
    在这里插入图片描述
    首先查看他的网络,并不是主网络也不是测试网络,左下角蓝点鼠标放上去之后显示本地网络,说明连接的我们的私有网络。另外,存在三个账户,且地址与我们console里面得到的信息相同。连接成功。

Redhat linux搭建ftp

阅读数 4354

没有更多推荐了,返回首页