├── Evidence.sol └── README.md /Evidence.sol: -------------------------------------------------------------------------------- 1 | contract Evidence{ 2 | uint CODE_SUCCESS = 0; 3 | uint FILE_NOT_EXIST = 3002; 4 | uint FILE_ALREADY_EXIST = 3003; 5 | uint USER_NOT_EXIST = 3004; 6 | 7 | struct FileEvidence{ 8 | bytes fileHash; 9 | uint fileUploadTime; 10 | address owner; 11 | } 12 | struct User{ 13 | address addr; 14 | uint count; 15 | mapping(bytes => FileEvidence) filemap; 16 | } 17 | 18 | // 文件hash对应的文件存证实体 19 | mapping(bytes => FileEvidence) fileEvidenceMap; 20 | 21 | // 交易hash对应的文件存证实体 22 | mapping(bytes => FileEvidence) tx2FileEvidenceMap; 23 | 24 | mapping(address => User) userMap; 25 | 26 | address[] userList; 27 | function saveEvidence(bytes fileHash,uint fileUploadTime) returns(uint code){ 28 | //get filemap under sender 29 | User storage user = userMap[msg.sender]; 30 | 31 | if (user.addr == 0x0) { 32 | user.addr = msg.sender; 33 | userList.push(msg.sender); 34 | } 35 | FileEvidence storage fileEvidence = user.filemap[fileHash]; 36 | if(fileEvidence.fileHash.length != 0){ 37 | return FILE_ALREADY_EXIST; 38 | } 39 | user.count += 1; 40 | fileEvidence.fileHash = fileHash; 41 | fileEvidence.fileUploadTime = fileUploadTime; 42 | fileEvidence.owner = msg.sender; 43 | user.filemap[fileHash] = fileEvidence; 44 | return CODE_SUCCESS; 45 | } 46 | 47 | function getEvidence(bytes fileHash) returns(uint code,bytes fHash,uint fUpLoadTime,address saverAddress) { 48 | //get filemap under sender 49 | User storage user = userMap[msg.sender]; 50 | if (user.addr == 0x0) { 51 | return (USER_NOT_EXIST,"",0,msg.sender); 52 | } 53 | FileEvidence memory fileEvidence = user.filemap[fileHash]; 54 | if(fileEvidence.fileHash.length == 0){ 55 | return (FILE_NOT_EXIST,"",0,msg.sender); 56 | } 57 | 58 | return(CODE_SUCCESS,fileEvidence.fileHash,fileEvidence.fileUploadTime,msg.sender); 59 | } 60 | 61 | function getUsers() returns(address[] users){ 62 | return userList; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Evidence 2 | 3 | 基于Solidity语言的,适用于存证场景的智能合约示例 4 | 5 | # 场景描述 6 | 7 | “存证”即“保全”,保全即证据固定与保管,是指用一定的形式将证据固定下来,加以妥善保管,以供司法人员或律师、认定案件事实时使用。 8 | 文件hash一旦通过该合约存入区块链便不可删除和修改,可用于证明电子合同等法律文书的有效性。 9 | 10 | 方法清单: 11 | 12 | - `function saveEvidence(bytes fileHash,uint fileUploadTime) returns(uint code)`:保存文件hash,文件hash会被保存到调用者的存证空间下; 13 | - `function getEvidence(bytes fileHash) returns(uint code,bytes fHash,uint fUpLoadTime,address saverAddress)`:从调用者的存证空间中搜索该hash,若搜索到便返回响应的存证详情,否则返回搜索失败的相应提示; 14 | - `function getUsers() returns(address[] users)`:查询用户列表,新的区块链账户若发起过saveEvidence请求,该账户便会被计入该列表。 15 | --------------------------------------------------------------------------------