Skip to content

ionchain/ionchain-core

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ionchain-core

本项目是ionchain协议golang版本的实现

在这篇博客中IPOS共识算法设计,详细说明了ionchain的共识算法的设计详情。

源码编译

在编译之前,你现需要安装golang(版本大于等于1.10)和C编译器

clone项目到你指定的目录中:

git clone https://github.com/ionchain/ionchain-core

使用以下命令编译ionc

cd ionchain-core

make ionc

或者可以通过以下命令编译其他平台的ionc版本(Linuxwindows

make all

在ionchain主网上运行全节点

用户在ionchain是最多的使用场景就是:创建账号,转移资产,部署、调用合约。为了满足这个特定的场景,可以使用快速同步方法来启动网络,执行以下命令:

$ ionc console

上面这个命令将产生以下两个操作:

  • 在快速同步模式下,启动ionc节点,在快速同步模式下,节点将会下载所有的状态数据,而不是执行所有ionchain网络上的所有交易.
  • 开启一个内置的javascript console控制台,在控制台中用户可以与ionchain网络进行交互。

使用Docker快速启动节点

启动ionchain网络最快速的方式就是在本地启动一个Docker

docker run -d --name ionchain-node -v /Users/alice/ionchain:/root \
           -p 8545:8545 -p 30303:30303 \
           ionchain/go-ionchain

docker会在/Users/alice/ionchain本地目录中映射一个持久的volume用来存储区块,同时也会映射默认端口。如果你想从其他容器或主机通过RPC方式访问运行的节点,需要加上--rpcaddr 0.0.0.0参数。默认情况下,ionc绑定的本地接口与RPC端点是不能从外部访问的。

以编程的方式与IONC节点交互

作为一个开发人员想通过自己的程序与ionchain网络进行交互,而不是通过JavaScript console的方式,为了满足这种需求,ionc有一个内置JSON-RPC API,这些API通过HTTPWebSocketsIPC方式暴露出去。其中IPC端口是默认开启的,HTTPWS端口需要手动开启,同时为了安全方面的考虑,这两个端口只会暴露部分API。

基于HTTP的JSON-RPC API 选项:

  • --rpc 开启 HTTP-RPC 服务
  • --rpcaddr HTTP-RPC 服务监听地址 (默认: "localhost")
  • --rpcport HTTP-RPC 服务监听端口 (默认: 8545)
  • --rpcapi 通过HTTP暴露出可用的API
  • --rpccorsdomain 逗号分隔的一系列域,通过这些域接收跨域请求

基于WebSocket的 JSON-RPC API选项:

  • --ws 开启 WS-RPC 服务
  • --wsaddr WS-RPC 服务监听地址(默认: "localhost")
  • --wsport WS-RPC 服务监听端口 (默认: 8546)
  • --wsapi 通过WS-PRC暴露出可用的API

基于IPC的JSON-RPC AP选项

  • --ipcdisable 禁用 IPC-RPC 服务
  • --ipcapi 通过IPC-PRC暴露出可用的API

注意:在使用http/ws接口之前,你需要了解相关的安全知识,在公网上,黑客会利用节点在公网上暴露的接口进行破坏式的攻击

创建一个私有链

创建一个自己的私有链会有一点复杂,因为你需要手动修改很多官方创建文件的配置。

定义私有链创世块

首先,为你的私有网络创建一个创始状态,这个创始状态需要你的私有网络中的所有节点都知晓,并达成共识。genesis.json以JSON格式组成:

{
		  "config": {
			"chainId":
		  },
		  "alloc": {},
			"0x0000000000000000000000000000000000000100": {
			  "code": "编译后的保证金合约二进制代码",
			  "storage": {
				"0x0000000000000000000000000000000000000000000000000000000000000000": "0x0a",
				"0x33d4e30ad2c3b9f507062560fe978acc29929f1ee5c2c33abe6d050171fd8c93": "0x0de0b6b3a7640000",
				"0xe0811e07d38b83ef44191e63c263ef79eeed21f1260fd00fef00a37495c1accc": "0xd9a7c07f349d4ac7640000"
			  },
			  "balance": ""
			}
		  },
		  "coinbase": "0x0000000000000000000000000000000000000000",
		  "difficulty": "0x01",
		  "extraData": "0x777573686f756865",
		  "gasLimit": "0x47e7c4",
		  "nonce": "0x0000000000000001",
		  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
		  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
		  "timestamp": "0x00",
		  "baseTarget": "0x1bc4fd6588",
		  "blockSignature": "0x00",
		  "generationSignature": "0x00"
		}

以上关于保证金合约是如何创建、编译的将在另外一个项目中做详细说明,我们建议你修改nonce值为一个随机数,这样可以防止未知的远程节点连接到你的网络中。如果你需要给某些账户预设一些资金,可以使用修改alloc值:

"alloc": {
  "0x0000000000000000000000000000000000000001": {"balance": "111111111"},
  "0x0000000000000000000000000000000000000002": {"balance": "222222222"}
}

genesis.json文件创建完成时,你需要在所有的ionc节点执行初始化操作。

$ ionc init path/to/genesis.json

创建bootnode节点

当所有的节点都完成初始化时,你需要启动一个bootstrap节点,通过bootstrap节点可以帮助其他的节点之间进行相互发现,这样他们就可以通过网络连接在一起。

$ bootnode --genkey=boot.key
$ bootnode --nodekey=boot.key

启动节点

bootnode启动后,通过telnet <ip> <port>命令测试一下是否可以从外部访问bootnode,现在启动所有的ionc节点,在启动时加上--bootnodes选项。同时为了保存你的私有链上的数据,你需要创建一个datadir目录,并通过--datadir选项设置。

$ ionc --datadir=path/to/custom/data/folder --bootnodes=<bootnode-enode-url-from-above>

注意:从现在开始你的节点已经完全从主链网络上断开,现在你可以配置miner来处理交易,并创建新的区块

运行私有链miner

ionc网络中miner的算力是通过在保证金合约的保证金数量决定的,启动一个实例用于挖矿:

$ ionc <usual-flags> --mine --etherbase=0x0000000000000000000000000000000000000000

其中—etherbase设置为miner的账号地址,miner可以通过--targetgaslimit调整区块的gas limit--gasprice设置接受交易的gas price