基于区块链的数字身份应用开发(上)

基于区块链的数字身份应用开发(上)

任务一:环境准备

(1)更新镜像源

apt update

(2)安装openssl、jdk、git

在这里插入图片描述

(3)配置JAVA_HOME环境变量

echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/" >>/etc/profilesource /etc/profile

使用wget命令下载build_chain.sh区块链开发部署工具

wget -c
http://res.zhonghui.vip/blockchain/training/trace/resourse/build_ch
ain.sh

使用wget命令下载FISCO BCOS二进制程序

wget -c
http://res.zhonghui.vip/blockchain/training/trace/resourse/fisco-bcos.tar.gz

在这里插入图片描述

解压缩文件,使用tar命令将fisco-bcos.tar.gz压缩包解压。-x参数解压文件,-v参数显 示解压过程,-f参数指定文件

tar -xvf fisco-bcos.tar.gz

(4)搭建并启动区块链网络

bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -e /root/tools/fisco-bcosbash nodes/127.0.0.1/start_all.sh

在这里插入图片描述

(5)安装并启动WeBASE-Front服务

使用wget命令下载WeBASE-Front程序

wget -c http://res.zhonghui.vip/blockchain/training/trace/resourse/webasefront.zip

使用unzip命令解压缩webase-front.zip文件

unzip webase-front.zip

将sdk密钥文件复制到webase-front/conf/文件夹

cp -r nodes/127.0.0.1/sdk/* webase-front/conf/

启动WeBASE-Front程序

cd webase-front
bash start.sh

在这里插入图片描述

(6)智能合约开发

创建项目文件

在这里插入图片描述

编写数字身份(DID.sol)合约

在这里插入图片描述

// SPDX-License-Identifier: SimPL-2.0
pragma experimental ABIEncoderV2;
pragma solidity ^0.6.10;
contract DID{
address private issuer;
address private owner;
string private did;
bool private status;
event ClaimChange(int256 retCode, address addr);
struct claim {
address claimAddr;
string claimType;
uint256 timestamp;
}
int256 private RET_SUCCESS = 0;
int256 private RET_EXISTED = -1;
claim[] private claims;
modifier onlyOwner(address identity, address actor) {
require(identity == actor, "Auth:Permissions error!");
_;
}
constructor (address _owner) public {
owner = _owner;
issuer = msg.sender;
did = DIDWrapper(addressToString(_owner));
status = true;
}
function addressToString(address addr) private pure
returns(string memory) {
bytes20 value = bytes20(uint160(addr));
bytes memory strBytes = new bytes(42);
strBytes[0] = '0';
strBytes[1] = 'x';
for(uint i = 0; i < 20; i++){
uint8 byteValue = uint8(value[i]);
strBytes[2 + (i<<1)] = encode(byteValue >> 4);
strBytes[3 + (i<<1)] = encode(byteValue & 0x0f);
}
}
return string(strBytes);
}
function encode(uint8 num) private pure returns(byte) {
if(num >= 0 && num <= 9){
return byte(num + 48);
}
return byte(num + 87);
}
function DIDWrapper(string memory addr) private pure
returns(string memory) {
string memory new_str = string(abi.encodePacked("did", ":",
"fisco", ":", addr));
return new_str;
}
function getDIDInfo() public view returns(address, address,
string memory, bool) {
return (issuer, owner, did, status);
}
function getDID() public view returns(string memory) {
return did;
}
function setStatus(bool _status) public onlyOwner(issuer,
msg.sender) {
status = _status;
}
function addClaim(address _claimAddr, string memory _claimType)
public onlyOwner(owner, msg.sender) returns (int256){
uint length = claims.length;
for (uint index = 0; index < length; index++){
claim storage instance = claims[index];
if(instance.claimAddr == _claimAddr){
emit ClaimChange(RET_EXISTED, _claimAddr);
return RET_EXISTED;
}
}
claims.push(claim({
claimAddr: _claimAddr,
claimType: _claimType,
timestamp: now
}));
emit ClaimChange(RET_SUCCESS, _claimAddr);
return RET_SUCCESS;
}
function queryClaims() public view returns(address[] memory,
string[] memory, uint256[] memory){
uint length = claims.length;
address[] memory claimAddrs = new address[](length);
string[] memory claimTypes = new string[](length);
uint256[] memory timestamps = new uint256[](length);
for (uint index = 0; index < length; index++) {
claim storage instance = claims[index];
claimAddrs[index] = instance.claimAddr;
claimTypes[index] = instance.claimType;
timestamps[index] = instance.timestamp;
}
return (claimAddrs, claimTypes, timestamps);
}
}

编写身份管理中心(DIDHub.sol)合约

在这里插入图片描述

// SPDX-License-Identifier: SimPL-2.0
pragma experimental ABIEncoderV2;
pragma solidity ^0.6.10;
import "Table.sol";
import "DID.sol";
contract DIDHub {
address private owner;
uint256 private VERSION = 1;
event createdDIDEvent(string did);
event setRevokedEvent(bool ok, string did);
modifier onlyOwner {
require(owner == msg.sender, "Auth:only owner is
authorized.");
_;
}
constructor() public {
owner = msg.sender;
createTable();
}
function createTable() private {
KVTableFactory kvtf = KVTableFactory(0x1010);
kvtf.createTable("Document", "did", "context, version,
createTime, publicKey");
}
function openTable() private view returns(KVTable){
KVTableFactory kvtf = KVTableFactory(0x1010);
KVTable kvTable = kvtf.openTable("Document");
return kvTable;
}
function createDID(address _addr, string memory _publicKey )
public onlyOwner returns(string memory){
DID DIDContract = new DID(_addr);
KVTable kvTable = openTable();
Entry document = kvTable.newEntry();
document.set("did", DIDContract.getDID());
document.set("context", address(DIDContract));
document.set("version", VERSION);
document.set("createTime", now);
document.set("publicKey", _publicKey);
kvTable.set(DIDContract.getDID(), document);
emit createdDIDEvent(DIDContract.getDID());
return (DIDContract.getDID());
}
struct Document {
string did;
address context;
uint version;
uint createTime;
string publicKey;
}
function getDocument(string memory _did) public view
returns(Document memory){
KVTable kvTable = openTable();
bool ok = false;
Entry entry;
Document memory document;
(ok, entry) = kvTable.get(_did);
if(ok){
document.did = entry.getString("did");
document.context = entry.getAddress("context");
document.version = entry.getUInt("version");
document.createTime = entry.getUInt("createTime");
document.publicKey = entry.getString("publicKey");
}
return (document);
}
function setRevoked(string memory _did, bool _status) public
onlyOwner returns(bool) {
KVTable kvTable = openTable();
bool ok = false;
Entry entry;
address context;
// 调用KVTable的get方法,返回entry实例对象
(ok, entry) = kvTable.get(_did);
if(ok){
context = entry.getAddress("context");
DID DIDContract = DID(context);
DIDContract.setStatus(_status);
}
emit setRevokedEvent(ok, _did);
return ok;
}
}

DIDHub 合约利用 CRUD 合约接口对 DID 和 DID文档进行存储映射,所以需要导入” Table.sol“ 合约,在终端输入如下命令,回到工作目录并下载 ”Table.sol“ 合约文件

cd .. && wget
http://res.zhonghui.vip/blockchain/DID/resource/Table.sol

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

编写工作声明(WorkClaim.sol )合约编码

在这里插入图片描述

// SPDX-License-Identifier: SimPL-2.0
pragma experimental ABIEncoderV2;
pragma solidity ^0.6.10;
contract WorkClaim{
struct Claim {
address issuer;
string issuerID;
uint256 issuerTime;
string userName;
string userID;
string companyName;
string post;
string employmentDate;
string leaveDate;
}
Claim private claim;
string private signature;
constructor(string memory _issuerId,
string memory _name, string memory _userId,
string memory _companyName, string memory _post,
string memory _employmentDate, string memory _leaveDate)
public {
claim.issuer = msg.sender;
claim.issuerID = _issuerId;
claim.issuerTime = now;
claim.userName = _name;
claim.userID = _userId;
claim.companyName = _companyName;
claim.post = _post;
claim.employmentDate = _employmentDate;
claim.leaveDate = _leaveDate;
}
function setSign(string memory _signature) public {
require(claim.issuer == msg.sender);
signature = _signature;
}
function getSign() public view returns(string memory){
return signature;
}
function getClaimInfo() public view returns(Claim memory){
return claim;
}
}

导出合约文件

在这里插入图片描述

在浏览器左下角可以观察到导出的“contracts.zip”压缩包,压缩包保存在 “/root/Downloads”文件夹下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/398064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS.FA开发流程

开发环境配置 1、DevEco Studio的安装 2、DevEcoStudio模拟运行工程&#xff1a;运行Tools->Device Manager&#xff0c;使用已认证的HW开发者联盟帐号Login&#xff08;在DP平台申请测试者权限&#xff09;&#xff0c;点击"允许"授权&#xff0c;选择一个设备运…

Windows10、ARM开发板、虚拟机Ubuntu可同时上网

一、Windows10端设置 1、打开网络配置 2、打开适配器 3、将window连接的wifi网卡设置为共享模式 4、查看本地连接的ip 到此&#xff0c;window10端设置完毕 二、设置虚拟机端&#xff08;Ubuntu&#xff09; 1、打开网络配置 2、打开适配器 3、查看本地连接的网卡名称 4、配置…

docker RUN覆盖容器主进程命令

docker容器启动失败正常都是由于启动主进程退出导致的&#xff0c;主进程启动命令往往都是由镜像Dockerfile文件最后的ENTRYPOINT或CMD定义的&#xff0c;此时可覆盖主进程启动命令&#xff0c;更换一个挂起的命令即可。我常用挂起命令&#xff1a;/bin/bash 1、检查容器启动主…

Maven的理解与应用

Maven使用 一、Maven的含义 Maven是一个构建项目的工具&#xff0c;也是一个管理项目的工具 二、Maven的应用 构建项目 管理依赖 做项目的热部署 基于项目做多模块&#xff08;modle&#xff09;的构建 三、Maven的安装 注意&#xff1a;maven本身不需要安装&#xff0c;下…

机器学习笔记:门控循环单元的建立

目录 介绍 结构 模型原理 重置门与更新门 候选隐状态 输出隐状态 模型实现 引入数据 初始化参数 定义模型 训练与预测 简洁实现GRU 思考 介绍 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;简称GRU&#xff09;是循环神经网络一种较为复杂的构成形式…

【网络编程】UDP通信基础模型实现

udpSer.c #include<myhead.h> #define SER_IP "192.168.119.143" #define SER_PORT 7777 int main(int argc, const char *argv[]) {//1.创建int sfd socket(AF_INET,SOCK_DGRAM,0);if(sfd -1){perror("socket error");return -1;}//2.连接struct…

element-ui周选择器,如何获取年、周、起止日期?

说明 版本&#xff1a;vue2、element-ui2.15.14 element-ui的日期选择器可以设为周&#xff0c;即typeweek&#xff0c;官方示例如下&#xff1a; 如果你什么都不操作&#xff0c;那么获取的周的值为&#xff1a; value1: Tue Aug 06 2024 00:00:00 GMT0800 (中国标准时间)如…

asp.net医院权限管理系统

医院管理的设计与实现程序 医院管理系统asp.netsqlserver 医院权限管理系统sqlserver 挂号管理 挂号类型管理 挂号登记 挂号查询 药品管理 计量单位管理药 品分类管理 药品编辑 病人资料 病人资料录入 病人资料编辑 病人资料查询 住院管理 住院登记 住院查询办理出院 病例管理 …

鸿蒙HarmonyOS开发:如何灵活运用动画效果提升用户体验

文章目录 一、动画概述1、动画的目的 二、显式动画 (animateTo)1、接口2、参数3、AnimateParam对象说明4、示例5、效果 三、属性动画 (animation)1、接口2、参数3、AnimateParam对象说明4、系统可动画属性4、示例5、效果 一、动画概述 动画的原理是在一个时间段内&#xff0c;…

HAProxy原理及实例

目录 目录 haproxy简介 haproxy的基本信息 haproxy下载并查看版本 haproxy的基本配置信息 global配置 ​编辑多进程和多线程 启用多进程 启用多线程 haproxy开启多线程和多进程有什么用 proxies配置 defaults frontend backend listen socat工具 实例&#xff1a…

Particle Swarm Optimization粒子群算法

目录 1.粒子群算法入门 1.1 简单的优化问题 1.1.1 盲目搜索 1.1.2 粒子群算法流程图 1.1.3 粒子群算法的核心公式 1.1.4 预设参数 1.1.5 初始化粒子的位置和速度 1.1.6 计算适应度 1.1.7 循环体&#xff1a;更新粒子速度和位置 1.1.8 模型改进 2.深入研究粒子群算法 …

CLEFT 基于高效大语言模型和快速微调的语言-图像对比学习

CLEFT: Language-Image Contrastive Learning with Efficient Large Language Model and Prompt Fine-Tuning github.com paper CLEFT是一种新型的对比语言图像预训练框架&#xff0c;专为医学图像而设计。它融合了医学LLM的预训练、高效微调和提示上下文学习&#xff0c;展…

【Linux】线程同步与互斥

目录 线程相关问题 线程安全 常见的线程安全的情况 常见的线程不安全的情况 可重入函数与不可重入函数 常见不可重入的情况 常见可重入的情况 可重入与线程安全的关系 联系 区别 线程同步与互斥 互斥锁 使用 死锁 死锁的四个必要条件 如何避免死锁 条件变量 同…

Unity读取Android外部文件

最近近到个小需求,需要读Android件夹中的图片.在这里做一个记录. 首先读写部分,这里以图片为例子: 一读写部分 写入部分: 需要注意的是因为只有这个地址支持外部读写,所以这里用到的地址都以 :Application.persistentDataPath为地址起始. private Texture2D __CaptureCamera…

【JavaEE】初步认识多线程

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f3b7; 一.线程 1.概念 线程&#xff08;Thread&#xff09;是在计算机科学中&#xff0c;特别是操作系统领域里的一个关键概念。它是操作系统能够进行…

Android中的Binder

binder是Android平台的一种跨进程通信&#xff08;IPC&#xff09;机制&#xff0c;从应用层角度来说&#xff0c;binder是客户端和服务端进行通信的媒介。 ipc原理 ipc通信指的是两个进程之间交换数据&#xff0c;如图中的client进程和server进程。 Android为每个进程提供了…

【聚类算法】

聚类算法是一种无监督学习方法&#xff0c;用于将数据集中的数据点自动分组到不同的类别中&#xff0c;这些类别也称为“簇”或“群”。聚类的目标是让同一簇内的数据点尽可能相似&#xff0c;而不同簇之间的数据点尽可能不相似。聚类算法广泛应用于多种领域&#xff0c;如数据…

xtrabackup搭建MySQL 8.0 主从复制

xtrabackup搭建MySQL 8.0 主从复制 安装MySQL 8.0.37安装xtrabackupGTIDs初始化从库参考&#xff1a;GTID概述GTID相较与传统复制的优势GTID自身存在哪些限制GTID工作原理简单介绍如何开启GTID复制GTID与传统模式建立复制时候语句的不同点传统复制GTID复制 GTID同步状态简单解析…

Linux系统编程 day09 线程同步

Linux系统编程 day09 线程同步 1.互斥锁2.死锁3.读写锁4.条件变量&#xff08;生产者消费者模型&#xff09;5.信号量 1.互斥锁 互斥锁是一种同步机制&#xff0c;用于控制多个线程对共享资源的访问&#xff0c;确保在同一时间只有一个线程可以访问特定的资源或执行特定的操作…

机器学习第一课

1.背景 有监督学习&#xff1a;有标签&#xff08;连续变量&#xff08;回归问题&#xff1a;时间序列等&#xff09;、分类变量&#xff08;分类&#xff09;&#xff09; 无监督学习&#xff1a;没有标签&#xff08;聚类、关联&#xff08;相关性分析&#xff1a;哪些相关…