(请原谅我这个版面代码展示实在太糟糕了)
数据资产上链管理模型
数据资产管理的一大痛点是针对数据准确性的管理,这在针对配置管理的介绍中也可以看出。本节我们将设计一种紧缩性数据资产链上管理模型,该模型采用严格的资产管控流程,以求极大限度的减少离岸数据资产的出现,并尽可能的避免因为非正常途径出现的数据资产变动、篡改而导致的失效等问题。同时,也通过简单的模型展示如何借助区块链技术实现配置管理改造两大目标的落地。
数据资产上链管理总流程
紧缩性数据资产链上管理模型主要涉及角色要素、组成关系以及业务流程几大部分,如下图所示。
在资产链上管理模型图中,领域代表了对不同技术、服务或部门的划分,其各自产生不同类型的数据资产。区块链节点分散在各领域中,共同组成区块链的整体网络。领域作为资产Owner在区块链中拥有自身的账户信息(资产Owner信息,包括标识、区块链账户地址信息)。针对Owner注册、资产验证、签名验证的合约部署在区块链网络中,主要负责对Owner合法性、数据资产信息进行上链存储验证动作。数据资产的消费、审计等活动均可以直接通过与区块链的交互实现。
可以从4个主要步骤描述资产从产生、上链到消费的整个过程。首先,资产Owner将自身标识、账户地址注册到Owner注册合约中,该合约由配置管理人员创建和掌握,只有通过配置管理人员认可的合法Owner才可以正常注册。之后,资产Owner产生数据资产,并对其进行签名、封装。封装好的数据资产将会发送至区块链存储,在这个过程中,资产验证合约会对其资产Owner的签名、资产Hash信息等进行验证,保证资产的合法和不被篡改。上链成功后,合约交易返回信息将作为资产的全局唯一标识,若未通过验证,则交易信息无法在区块链中正常查询。资产上链成功后,任何单位均可以通过唯一标识,获取资产信息,从而开展数据消费、验证活动。
下面我们将针对资产上链管理的4大步骤进行详细阐述。
模型开发环境说明
1、以太坊仿真工具Ganache-cli
首先介绍用于该模型展示的以太坊仿真工具。Ganache-cli是以太坊节点仿真器软件,使用JavaScript编写,可以方便开发者快速进行以太坊DApp的开发与测试。其使用简单,通过ganache-cli -h 10.10.10.16 -p 8545启动ganache-cli工具后,便会提供一个以太坊环境,并在接口8545上进行监听,同时会生成10个以太坊账户,每个账户默认分配100以太币。
其简单形式如下:
| Available Accounts==================(0) 0x5Bf1c632464970c28C76e73f347C8010be6328fe (100 ETH)(1) 0x9a09d5471c8D6355e0410bc87536Ef5E6FD415b9 (100 ETH)(2) 0xDA4D042aA75f8A1f9e24FC9C2886c53b0D7b7c10 (100 ETH)(3) 0xBdEdDe95Bf5E47421049e0CF9dC5Fc7D75AdA10C (100 ETH)…Private Keys==================(0) 0x32bffb59bceafadc8375e4f29ea44aa27720e21c0aa0dfca699bd89f9ab9b161(1) 0x4db906ac5873476a92ee3c857f21586b9ae6f6b6bb3c4c00089c14c84815b3f9(2) 0x4fd1b512178327841895c4a8d7bed4caa3475f90851f62c6741ba194e839efe8(3) 0xe22931af0ba8795d1aa6d7213d51ec028cf42606bf20bc427a9524cfbd2cdfac…HD Wallet==================Mnemonic: fiction pool unfair empower medal hard liberty wrap choice physical ridge ethicsBase HD Path: m/44'/60'/0'/0/{account_index}Gas Price==================20000000000Gas Limit==================6721975Listening on 10.10.10.16:8545 |
|---|
2、采用python Web3.py开发以太坊DApp
Web3.py是一个用于与以太坊交互的Python库,可以在开发DApp过程中用于发送事务、与智能合约交互、读取区块数据等。在ganache-cli环境就绪之后,下面为使用python连接以太坊环境(这里选用web3.py的方式,也可以使用通用http的访问方式)
from web3 import Web3 from web3.eth import Eth from web3._utils.encoding import to_hex url = "http://10.10.10.16:8545"w3 = Web3(Web3.HTTPProvider(url))
accounts = w3.manager.request_blocking('eth_accounts',[]) for account_addr in accounts: print("Addr=> {0}".format(account_addr)) # 查看部分账户余额eth = Eth(w3)addr1_balance = eth.getBalance(accounts[0])addr2_balance = eth.getBalance(accounts[1])print('Addr1 => {0} : Balance => {1}'.format(accounts[0], addr1_balance))print('Addr2 => {0} : Balance => {1}'.format(accounts[1], addr2_balance)) # 实现一个账户间交易payload = { 'from': accounts[0], 'to': accounts[1], 'value': 1000}tx_hash = eth.sendTransaction(payload)receipt = eth.waitForTransactionReceipt(tx_hash, 60)addr1_balance = w3.eth.getBalance(accounts[0], 'latest')addr2_balance = w3.eth.getBalance(accounts[1], 'latest')print('gas used => {0}'.format(receipt.gasUsed))print('Addr1 => {0} : Balance => {1}'.format(accounts[0], addr1_balance))print('Addr2 => {0} : Balance => {1}'.format(accounts[1], addr2_balance)) | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
在上面简单案例里面,我们通过web3.py连接仿真环境,获取账号信息,并做了一个简单的转账交易,其输出如下。
| D:\block_chain\anaconda\python.exe D:/block_chain/cmdb/Ganache_test.pyAddr=> 0x5Bf1c632464970c28C76e73f347C8010be6328feAddr=> 0x9a09d5471c8D6355e0410bc87536Ef5E6FD415b9Addr=> 0xDA4D042aA75f8A1f9e24FC9C2886c53b0D7b7c10Addr=> 0xBdEdDe95Bf5E47421049e0CF9dC5Fc7D75AdA10C…Addr1 => 0x5Bf1c632464970c28C76e73f347C8010be6328fe : Balance => 100000000000000000000Addr2 => 0x9a09d5471c8D6355e0410bc87536Ef5E6FD415b9 : Balance => 100000000000000000000gas used => 21000Addr1 => 0x5Bf1c632464970c28C76e73f347C8010be6328fe : Balance => 99999579999999999000Addr2 => 0x9a09d5471c8D6355e0410bc87536Ef5E6FD415b9 : Balance => 100000000000000001000 |
|---|
3、采用truffle框架开发solidity智能合约
Truffle是基于Javascript的以太坊Solidity语言开发框架。提供了智能合约的编程和部署框架,可以帮助我们将软件简单快速部署到区块链上。下面是一个针对HelloWorld的智能合约的部署。
── build
│ └── contracts
│ ├── HelloWorld.json
│ └── Migrations.json
├── contracts
│ ├── HelloWorld.sol
│ └── Migrations.sol
├── migrations
│ ├── 1_initial_migration.js
│ └── 2_initial_migration.js
├── README.md
├── truffle-box.json
└── truffle-config.js
]()
在使用Truffle部署的HelloWorld智能合约的基本目录结构中,contracts存放了智能合约的基本代码HelloWorld.sol文件,migrations里面存放了智能合约的部署信息,truffle-config.js中配置有区块链环境的基本信息。
| [root@localhost contracts]# cat HelloWorld.solpragma solidity >=0.4.21 <0.6.0;contract HelloWorld { function sayHello() public view returns (string memory) { return "HelloWorld"; }} [root@localhost migrations]# cat 2_initial_migration.jsvar HelloWorld = artifacts.require("./HelloWorld.sol");module.exports = function(deployer){ deployer.deploy(HelloWorld);}; [root@localhost bare-box-master]# cat truffle-config.js...module.exports = { networks: { development: { host: "10.10.10.16", port: 8545, network_id: "*" }... |
|---|
采用truffle migrate部署合约:
| Compiling your contracts...===========================> Compiling ./contracts/HelloWorld.sol…2_initial_migration.js====================== Deploying 'HelloWorld' ---------------------- > transaction hash: 0x68e876e2f690f41d1f55f1deb635b1dc86812969228c637471fcd0291609ff09 > Blocks: 0 Seconds: 0 > contract address: 0x5aa51B63A8D2d35192C45F7dE9c22049b55353Ec > block number: 4 > block timestamp: 1646208409 > account: 0x5Bf1c632464970c28C76e73f347C8010be6328fe > balance: 99.990875019999999 > gas used: 129485 > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.0025897 ETH> Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.0025897 ETHSummary=======> Total deployments: 2> Final cost: 0.00786452 ETH |
|---|
可以看到HelloWorld合约默认通过account[0]也就是仿真环境提供的第一个账户地址部署,其合约地址为:“0x5aa51B63A8D2d35192C45F7dE9c22049b55353Ec”。
下面使用truffle调用智能合约。
| truffle(development)> var contractundefinedtruffle(development)> HelloWorld.deployed().then(function(instance){contract=instance;});undefined truffle(development)> contract.sayHello()'HelloWorld' |
|---|
可以看到HelloWord合约已经正常部署并调用,获得了相应的返回值。