5. EVI存证合约
随着数字化转型的加速,各行各业产生了大量电子数据,这些数据往往具有重要的法律意义和商业价值。为了确保这些电子证据的有效性与合法性,需要对它们进行可靠的存储和保管。传统的中心化数据库在安全性、不可篡改性以及抗审查性方面存在局限,而区块链技术以其独特的去中心化特性、不可篡改的数据记录和加密保护机制,为电子证据的存储提供了一个理想的解决方案。区块链技术通过其分布式账本的特性,保证了一旦数据被加入到区块中并经过网络共识验证后,该数据就无法被更改或删除。这种不可篡改性使得区块链成为了一个理想的平台,用于创建时间戳证明、确权、知识产权保护和其他各种形式的证据存证。
长安链存证合约标准CM-CS-231201-Evidence (CMEVI-2),是针对基于长安链的存证类合约所制定的标准化协议。此标准旨在为开发和使用存证类合约提供明确的指导,确保合约的可靠性、安全性及其在司法和商业应用中的互操作性。
EVI合约具有以下功能:
存证:用户可以通过EVI合约将自己的数据或者哈希存证到链上。
核验:用户可以通过EVI合约核验链上是否存在某数据。
查询:用户可以通过EVI合约查询方法获取存证数据。
EVI合约适用于以下场景:
法律文件的存储:区块链存证合约为敏感的法律文件提供了一个不可篡改和易于验证的存储解决方案,有助于减少纠纷并加速法律程序。
知识产权的保护:通过在区块链上记录和保护版权信息,存证合约能够确保创作内容的所有权和使用权得到可靠保护,防止未授权使用。
医疗记录的安全存储:区块链存证合约可以安全地存储病历和其他敏感的医疗数据,同时确保只有授权的个人或机构才能访问这些信息。
供应链管理中的商品追踪:利用存证合约记录商品从生产到交付的每一步,增加了供应链透明度,有助于防伪和提高产品质量监控。
5.1. 合约标准
EVI合约中的核心数据对象包括一个存证结构。核心方法包括存证及查询。 这些数据结构、合约接口都定义在:这里
合约标准参考:合约标准
存证合约源码参考:https://git.chainmaker.org.cn/contracts/contracts-go/-/tree/chainweaver_v0.1/standard-evidence
5.2. 调用示例
调用示例参考:
https://git.code.tencent.com/ChainMaker/opennet/did/tree/dev/contract
在cmc命令行下,可以快速安装、调用和查询该EVI合约,使用示例如下:
5.2.1. 安装合约
./cmc client contract user create \
--contract-name=evidence \
--runtime-type=DOCKER_GO \
--byte-code-path=./evidence.7z \
--version=1.0 \
--sdk-conf-path=./testdata/sdk_config.yml \
--sync-result=true \
--params="{}"
5.2.2. 升级合约
./cmc client contract user upgrade \
--contract-name=evidence \
--runtime-type=DOCKER_GO \
--byte-code-path=./evidence.7z \
--version=2.0 \
--sdk-conf-path=./testdata/sdk_config.yml \
--admin-key-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.key,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.key \
--admin-crt-file-paths=./testdata/crypto-config/wx-org1.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org2.chainmaker.org/user/admin1/admin1.sign.crt,./testdata/crypto-config/wx-org3.chainmaker.org/user/admin1/admin1.sign.crt \
--sync-result=true \
--params="{}"
5.2.3. 存证
# 单个存证
./cmc client contract user invoke \
--contract-name=evidence \
--method=Evidence \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"id\":\"02\",\"hash\":\"a2\",\"metadata\":\"{\\\"hashType\\\":\\\"file\\\",\\\"hashAlgorithm\\\":\\\"sha256\\\",\\\"username\\\":\\\"taifu\\\",\\\"timestamp\\\":\\\"1672048892\\\",\\\"proveTimestamp\\\":\\\"\\\"}\"}" \
--sync-result=true \
--result-to-string=true
# 批量存证
./cmc client contract user invoke \
--contract-name=evidence \
--method=EvidenceBatch \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"evidences\":\"[{\\\"id\\\":\\\"id1\\\",\\\"hash\\\":\\\"hash1\\\",\\\"txId\\\":\\\"\\\",\\\"blockHeight\\\":0,\\\"timestamp\\\":\\\"\\\",\\\"metadata\\\":\\\"11\\\"},{\\\"id\\\":\\\"id2\\\",\\\"hash\\\":\\\"hash2\\\",\\\"txId\\\":\\\"\\\",\\\"blockHeight\\\":0,\\\"timestamp\\\":\\\"\\\",\\\"metadata\\\":\\\"11\\\"}]\"}" \
--sync-result=true \
--result-to-string=true
5.2.4. 核验存在性
# 哈希是否存在
./cmc client contract user get \
--contract-name=evidence \
--method=ExistsOfHash \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"hash\":\"a2\"}" \
--result-to-string=true
5.2.5. 查询
# 根据哈希查询
./cmc client contract user get \
--contract-name=evidence \
--method=FindByHash \
--sdk-conf-path=./testdata/sdk_config.yml \
--params="{\"hash\":\"a2\"}" \
--result-to-string=true