基于Delta区块链单节点的联邦隐私计算服务搭建手册
目录
参考文献
使用subkey创建node key
如果重新设置node-key需要。
- 安装subkey
git clone https://github.com/paritytech/substrate.git
cd substrate
sudo dnf install cargo -y
sudo dnf install cmake -y
sudo dnf -y install protobuf-devel protobuf-compiler
// 编译
cargo build --package subkey --release
// 帮助文档
./target/release/subkey --help
// 生成node-key
./target/release/subkey generate-node-key
12D3KooWP46T3Xe7XAJjfgEZuHRi6bvHJvGNUQWWsQrYWkZaypgf // random key
33d41eddac740715d7810cdb091fae4093760fedc682b28e6513b72158c8d47a // node-key
启动Delta区块链单节点
1. 启动节点-docker方式
$ docker pull deltampc/delta-chain:dev
$ mkdir delta-node
$ cd delta-node
$ docker run -d -p 9944:9944 -p 9933:9933 -v ${PWD}/data:/root/.local --entrypoint ./node --name delta-chain \
deltampc/delta-chain:dev --dev --ws-external --rpc-external --alice \
--node-key=33d41eddac740715d7810cdb091fae4093760fedc682b28e6513b72158c8d47a
--ws-external
,--rpc-external
向外开放ws和http的rpc端口,不然浏览器无法访问。
删除delta-chain容器
docker ps | awk '{print $1}' | grep -v CONTAINER | xargs docker stop | xargs docker rm
进入delta-chain容器
docker exec -it delta-chain /bin/bash
// 查看node的参数
root@c9499628050d:/delta# ./node help
2. 启动节点-源码安装
// 编译
$ cargo build --release
// 启动节点
$ ./target/release/delta-chain-node --dev --ws-external --rpc-external
数据位置:~/.local/share/delta-chain-node/
3. 配置节点【多节点的时候需要】
- 使用https://polkadot.js.org/apps/?rpc=ws%3A%2F%2F127.0.0.1%3A9944#/explorer进行配置和区块信息查看。
- 具体配置参考delta-mpc/delta-chain
启动Delta区块链浏览器
下面配置在与单节点同一台服务器上可以运行。
启动数据库
$ mkdir postgres
$ cd postgres
$ docker run -p 5432:5432 -d -v ${PWD}/data:/var/lib/postgresql/data -e PGDATA=/var/lib/postgresql/data/pgdata -e POSTGRES_PASSWORD='1234qwer' postgres:alpine3.14
启动浏览器
$ docker pull deltampc/delta-chain-explorer:dev
$ mkdir delta-explorer
$ cd delta-explorer && touch .env
.env文件信息如下:
DATABASE_URL=postgresql://postgres:1234qwer@10.9.40.7:5432/explorer?ssl=false
ETHEREUM_JSONRPC_VARIANT=ganache
ETHEREUM_JSONRPC_HTTP_URL=http://10.9.40.7:9933
ETHEREUM_JSONRPC_TRACE_URL=http://10.9.40.7:9933
ETHEREUM_JSONRPC_WS_URL=ws://10.9.40.7:9944
COIN=DAI
启动浏览器容器,其中--log-driver local --log-opt max-size=10m
限制该容器的日志大小,防止占满系统盘
$ docker run -d -p 4000:4000 --env-file ./.env deltampc/delta-chain-explorer:dev --log-driver local --log-opt max-size=10m
此时在http://127.0.0.1:4000中可以看到区块信息。
奇怪现象:上述两个浏览器看到的区块信息哈希和父区块哈希不一样。【待解决】
部署合约
下面的配置是在与单节点不同节点上配置。
1. 使用truffle来编辑和部署合约
$ git clone --depth 1 --branch v0.5.2 https://github.com/delta-mpc/delta-contracts.git
$ npm install -g truffle
// 编辑truffle-config.js
module.exports = {
networks: {
development: {
url: <eth url>,
network_id: "*", // Match any network id
},
},
}
$ truffle migrate
如果出现如下错误:
Truffle is currently using solc 0.5.16, but one or more of your contracts specify pragma solidity >=0.7.0 <0.9.0
则修改truffle-config.js
增加compilers
设置:
module.exports = {
networks: {
development: {
url: "ws://127.0.0.1:9944",
network_id: "*", // Match any network id
from: "0xcee2b721fc2fcbb3c136effec5d555c9f9c97db1",
},
},
compilers: {
solc: {
version: "^0.8.0"
}
}
};
此时会出现sender不识别的错误,改为手动安装没有问题,所以应该是sender部分查找有问题。
2. 使用truffle控制台【展示】
2.1 创建帐户
$ cd delta-contracts
// 确保步骤1中除sender错误外,无其他错误
// 进入到truffle控制台
$ truffle console
// 创建帐户
truffle(development)> web3.eth.accounts.create()
{
address: '0x0F0a62F1f52e272484F04e7D5A60788f87a36b40',
privateKey: '0xd0fe90b331b5b113f8203416de70ea5425db9ceb87db6ab68c37d01ede00719a',
signTransaction: [Function: signTransaction],
sign: [Function: sign],
encrypt: [Function: encrypt]
}
2.2 进行其他web3操作
3. 使用polkadot.js.org进行转账【展示】
Developer => Extrinsics => evm => call
source: 0xd43593c715fdd31c61141abd04a99fd6822c8558
target: 0x0F0a62F1f52e272484F04e7D5A60788f87a36b40
input: 0x
value: 1000000000000000000000 // 1000 Ether
gas_limit: 4294967295
gas_price: 1
nonce: <empty>
4. 部署合约
部署合约: Developer => Extrinsics => ALICE => evm => create
查看所有安装的合约信息:Developer => Chain state => evm => accountCodes(H160): Bytes
4.1 安装identity合约,直接使用bytecode安装即可
Developer => Extrinsics => ALICE => evm => create(...)
4.2 安装横向联邦学习合约HFLContract
- 方法一
使用abi.hashex.org/获得constructor
的encode data
,如下图所示:
然后拼接bytecode
和上述的encode data
,得到合约安装时的Init参数:
0x6080604052600580546001600160801b0319166901000000000000a000001790553480156200002d57600080fd5b50604051620046ce380380620046ce8...3ec16505711514a8ef4d3f587682c024c3cf270ef860b7077b59e80c9a49364736f6c634300080d003300000000000000000000000029673710367ecc4b9239b4cd51bd1c798e3b2ca3
- 方法二
首先使用truffle console获得新的encode bytes。
$ truffle console
// 可以测试Identity合约是否安装成功
truffle(develop)> identity = await HFLContract.at('0x29673710367ecc4b9239b4cd51bd1c798e3b2ca3')
truffle(development)> identity.address
'0x29673710367EcC4b9239b4CD51bd1c798E3B2ca3'
// 获得HFLContract的对象
truffle(development)> hfl = new web3.eth.Contract(HFLContract.abi)
// 如果bytecode过长,控制台输出有问题。可以先不用bytecode从而获得地址的encode bytes,然后再拼接。
truffle(development)> abiData = hfl.deploy({ data: '0x' + <bytecode>, arguments: ["0x29673710367EcC4b9239b4CD51bd1c798E3B2ca3"] }).encodeABI()