參考于https://mp.weixin.qq.com/s/YG1sbWKA8kS8VAT6pIIaBQ
目的
結合Character角色合約與Evidence存證合約打造結婚證書,示范角色合約和存證合約如何使用,
智能合約的開發步驟
- 角色分析
- 基于角色的功能設計
- 編碼實作各個功能
合約結構說明

Character: 見證人合約(作業人員、結婚夫妻)
Evidence: 存證多簽合約
EvidenceFactory: 存證工廠合約
MarriageEvidence: 結婚合約
Roles: 角色合約
1. 角色控制合約
pragma solidity^0.4.25;
import "./Roles.sol";
contract Character{
using Roles for Roles.Role;
Roles.Role private _character;
event characterAdded(address amount,string summary);
event characterRemoved(address amount);
event characterRevised(address amount,string summary);
event characterSeeked(address amount);
address owner;
address[] characters;
constructor()public{
owner = msg.sender;
}
modifier onlyOwner(){
require(owner == msg.sender,"Only owner can call");
_;
}
function isCharacter(address amount)public view returns(bool){
return _character.has(amount);
}
function _addCharacter(address amount,string _summary)internal{
_character.add(amount,_summary);
characters.push(amount);
emit characterAdded(amount,_summary);
}
function _removeCharacter(address amount)internal{
_character.remove(amount);
emit characterRemoved(amount);
}
function _reviseCharacter(address amount,string _summary)internal{
_character.revise(amount,_summary);
emit characterRevised(amount,_summary);
}
function _seekCharacter(address amount)internal view returns(string){
return _character.seek(amount);
emit characterSeeked(amount);
}
function _removeCharacterByAddress(address amount)internal{
for (uint i = 0; i < characters.length; i++) {
if (amount == characters[i])
for (uint j = i; j < characters.length-1; j++)
characters[j] = characters[j+1];
characters.length--;
}
}
function addCharacter(address amount,string _summary)public onlyOwner{
require(!isCharacter(amount),"The character already exist");
_addCharacter(amount,_summary);
}
function removeCharacter(address amount)public onlyOwner{
require(isCharacter(amount),"The character does not exist");
_removeCharacter(amount);
_removeCharacterByAddress(amount);
}
function reviseCharacter(address amount,string _summary)public onlyOwner{
require(isCharacter(amount),"The character does not exist");
_reviseCharacter(amount,_summary);
}
function seekCharacter(address amount)public view returns(string) {
require(isCharacter(amount),"The character does not exist");
return _seekCharacter(amount);
}
function getAllCharater()public view returns(address[]){
return characters;
}
}
pragma solidity^0.4.25;
library Roles{
struct Role{
mapping(address=>bool) bearer;
mapping(address=>string) summary;
}
//判斷角色
function has(Role storage role,address amount)internal view returns(bool){
require(amount!=address(0),"Address is zero address");
return role.bearer[amount];
}
//添加角色
function add(Role storage role,address amount,string _summary)internal{
require(!has(role,amount),"Address already exists");
role.bearer[amount] = true;
role.summary[amount] = _summary;
}
//洗掉角色
function remove(Role storage role,address amount)internal{
require(has(role,amount),"Address does not exist");
role.bearer[amount] = false;
}
//修改角色
function revise(Role storage role,address amount,string _summary)internal {
require(has(role,amount),"Address does not exist");
role.summary[amount] = _summary;
}
//查詢角色
function seek(Role storage role,address amount)internal view returns(string){
require(has(role,amount),"Address does not exist");
return role.summary[amount];
}
}
介面說明
提供了兩個合約:Roles合約,Character合約,其中Character合約是對外服務合約,Roles合約是庫合約,用于資料和邏輯抽象化,Character合約:對外服務的唯一介面,包含:
?addCharacter(address amount,string summary):管理員進行添加角色操作,amount是添加角色的地址, _summary添加角色的基本資訊
?removeCharacter(address amount): 管理員進行洗掉角色操作,amount是洗掉角色的地址
?reviseCharacter(address amount,string _summary):管理員進行修改角色資訊操作,amount是修改角色的地址, _summary修改角色的基本資訊 ?seekCharacter(address amount): 任何人都可以進行查詢角色資訊操作,amount是查詢角色的地址
?getAllCharater():任何人都可以進行查看當前存在的所有角色操作,
?isCharacter(address amount): 任何人都可以進行查看當前地址是否已經被添加為角色,amount是查詢的地址
MarriageEvidence合約
pragma solidity^0.4.25;
import "./EvidenceFactory.sol";
import "./Character.sol";
contract MarriageEvidence is Character{
address admin;
address eviContractAddress;
address eviAddress;
constructor() public Character{
admin = msg.sender;
}
modifier adminOnly{
require(msg.sender == admin ,"require admin");
_;
}
modifier charactersMustBeAddedFirst{
require(getAllCharater().length != 0,"It is null");
_;
}
modifier signersOnly{
require(EvidenceFactory(eviContractAddress).verify(msg.sender),"you not is signer");
_;
}
function deployEvi() external adminOnly charactersMustBeAddedFirst{
addCharacter(msg.sender,"民政局");
EvidenceFactory evi = new EvidenceFactory(getAllCharater());
eviContractAddress = address(evi);
}
function getSigners() public constant returns(address[]){
return EvidenceFactory(eviContractAddress).getSigners();
}
function newEvi(string _evi)public adminOnly returns(address){
eviAddress = EvidenceFactory(eviContractAddress).newEvidence(_evi);
return eviAddress;
}
function sign() public signersOnly returns(bool) {
return EvidenceFactory(eviContractAddress).addSignatures(eviAddress);
}
function getEvi() public constant returns(string,address[],address[]){
return EvidenceFactory(eviContractAddress).getEvidence(eviAddress);
}
}
結婚證書簽發流程
- 部署 MarriageEvidence 合約
民政局管理員wzl呼叫部署合約

- 呼叫添加角色介面
民政局管理員wzl呼叫方法:
添加丈夫地址:0xb2bb841d09c9e0ff82eee353715197e046c9684c 添加丈夫資訊:
{
“name”:“Alice”,
“url”:“https://blog.csdn.net/weixin_43402353”,
“id”:321183200007270010,
“sex”:“male”,
“address”:{
“street”:“科技 園路.”,
“city”:“江蘇蘇州”,
“country”:“中國”
}
}
添加妻子地址:0x336c9a9d34c3dca40f8a0ac9573b45fa576b07a3 添加妻子資訊:
{
“name”:“Bob”,
“url”:“https://blog.csdn.net/weixin_43402353”,
“id”:321183200007270010,
“sex”:“male”,
“address”:{
“street”:“科技 園路.”,
“city”:“江蘇蘇州”,
“country”:“中國”
}
}



- 呼叫查看資訊介面


- 部署存證合約
呼叫 deployEvi 方法,
- 創建結婚證書
本質上是支持多簽的一條存證,
- 呼叫sign介面,夫妻分別簽名

- 呼叫getEvi查看證書

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325691.html
標籤:區塊鏈
上一篇:部署智能合約




