基于Delta区块链单节点的联邦隐私计算服务搭建手册

参考文献

使用subkey创建node key

如果重新设置node-key需要。

参考subkey官方文档

  1. 安装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. 配置节点【多节点的时候需要】

启动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/获得constructorencode 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()
posted @ 2022-09-27 13:48  水中墨色  阅读(233)  评论(0编辑  收藏  举报