如何签名一个智能同盟国协约国

2.3k 人阅读
标签:至少1个,最多5个
什么是智能合约
一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。一个合约由一组代码(合约的函数)和数据(合约的状态)组成,并且运行在以太坊虚拟机上.
以太坊虚拟机(EVM)使用了256比特长度的机器码,是一种基于堆栈的虚拟机,用于执行以太坊智能合约 。由于EVM是针对以太坊体系设计的,因此使用了以太坊账户模型(Account Model)进行价值传输。
合约的代码具有什么能力:
读取交易数据。
读取或写入合约自己的存储空间。
读取环境变量【块高,哈希值,gas】
向另一个合约发送一个“内部交易”。
在区块链平台的架构
1. 什么是solidity
Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上。
solidity 语言特点
它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它有很多的不同点:
异常机制,类似于事务的原子性。一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行
存储是使用网络上的区块链,数据的每一个状态都可以永久存储。
2. 开发的工具
Visual Studio Code + soliidty 插件
3 快速入门
准备工作:搭建区块链
3.1 举个例子
完整的步骤:
2. 编译合约
3. 部署合约
4. 测试合约
参考操作步骤
$ git clone "https://github.com/cristicmf/bcos-qucik-start-demo"
$ cd startDemo
$ npm install
$ babel-node index.js
文件结构说明
├── README.md
├── SimpleStartDemo.sol
# 合约代码
├── codeUtils.js
├── config.js
# 配置文件
├── index.js
# 部署合约和测试合约
├── output
# abi/bin/address的输出
├── StartDemo.abi
├── StartDemo.address
└── StartDemo.bin
├── package.json
├── sha3.js
└── web3sync.js
pragma solidity ^0.4.2;
contract SimpleStartDemo {
int256 storedD
event AddMsg(address indexed sender, bytes32 msg);
modifier only_with_at_least(int x) {
if (x &= 5) {
function SimpleStartDemo() {
storedData = 2;
function setData(int256 x) public only_with_at_least(x){
storedData =
AddMsg(msg.sender, "[in the set() method]");
function getData() constant public returns (int256 _ret) {
AddMsg(msg.sender, "[in the get() method]");
return _ret = storedD
3.2 部署合约
$ babel-node index.js
1. 编译合约
execSync("solc --abi
--overwrite -o " + config.Ouputpath + "
" + filename + ".sol");
2. 部署合约到区块链上
var Contract = await web3sync.rawDeploy(config.account, config.privKey, filename);
3. 对合约进行读写
var address = fs.readFileSync(config.Ouputpath + filename + '.address', 'utf-8');
var abi = JSON.parse(fs.readFileSync(config.Ouputpath /*+filename+".sol:"*/ + filename + '.abi', 'utf-8'));
var contract = web3.eth.contract(abi);
var instance = contract.at(address);
//获取链上数据
var data = instance.getData();
//修改链上数据
var func = "setData(int256)";
var params = [10];
var receipt = await web3sync.sendRawTransaction(config.account, config.privKey, address, func, params);
3.2.1 引入概念:
address:以太坊地址的长度,大小20个字节,160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,也可以随时将一个地址串,得到对应的代码进行调用。合约的地址是基于账号随机数和交易数据的哈希计算出来的
ABI:是以太坊的一种合约间调用时或消息发送时的一个消息格式。就是定义操作函数签名,参数编码,返回结果编码等。
交易:以太坊中“交易”是指存储从外部账户发出的消息的签名数据包。
简单理解是:只要对区块链进行写操作,一定会发生交易。
交易回执:
发生交易后的返回值
3.2.2 扩展阅读:
3.3 合约文件结构简介
1. 版本声明
pragma solidity ^0.4.10;
1. 引用其它源文件
import “filename”;//全局引入
1. 状态变量(State Variables)
int256 storedD
详细说明见下文
2. 函数(Functions)
function setData(int256 x) public {
storedData =
AddMsg(msg.sender, "[in the set() method]");
function getData() constant public returns (int256 _ret) {
return _ret = storedD
3. 事件(Events)
//事件的声明
event AddMsg(address indexed sender, bytes32 msg);
//事件的使用
function setData(int256 x) public {
storedData =
AddMsg(msg.sender, "in the set() method");
4. 结构类型(Structs Types)
contract Contract {
struct Data {
function set(uint id, uint deadline, uint amount) {
data.deadline =
data.amount =
5. 函数修饰符(Function Modifiers)
类似于hook
modifier only_with_at_least(int x) {
if (x &= 5) {
4. 合约编程模式COP
面向条件的编程(COP)是面向合约编程的一个子域,作为一种面向函数和命令式编程的混合模式。COP解决了这个问题,通过需要程序员显示地枚举所有的条件。逻辑变得扁平,没有条件的状态变化。条件片段可以被正确的文档化,复用,可以根据需求和实现来推断。重要的是,COP在编程中把预先条件当作为一等公民。这样的模式规范能保证合约的安全。
4.1 FEATURES
函数主体没有条件判断
contract Token {
// The balance of everyone
mapping (address =& uint)
// Constructor - we're a millionaire!
function Token() {
balances[msg.sender] = 1000000;
// Transfer `_amount` tokens of ours to `_dest`.
function transfer(uint _amount, address _dest) {
balances[msg.sender] -= _
balances[_dest] += _
function transfer(uint _amount, address _dest) {
if (balances[msg.sender] & _amount)
balances[msg.sender] -= _
balances[_dest] += _
modifier only_with_at_least(uint x) {
if (balances[msg.sender] &= x) _;
function transfer(uint _amount, address _dest)
only_with_at_least(_amount) {
balances[msg.sender] -= _
balances[_dest] += _
扩展阅读:
5. 语法介绍
5.2 引用类型(Reference Types)
不定长字节数组(bytes)
字符串(string)bytes3 a = "123";
数组(Array)
结构体(Struts)
6. 重要概念
6.1 Solidity的数据位置
数据位置的类型
变量的存储位置属性。有三种类型,memory,storage和calldata。
memory存储位置同我们普通程序的内存类似。即分配,即使用,越过作用域即不可被访问,等待被回收-
storage的变量,数据将永远存在于区块链上。
calldata 数据位置比较特殊,一般只有外部函数的参数(不包括返回参数)被强制指定为calldata
Storage - 状态变量的存储模型
大小固定的变量(除了映射,变长数组以外的所有类型)在存储(storage)中是依次连续从位置0开始排列的。如果多个变量占用的大小少于32字节,会尽可能的打包到单个storage槽位里,具体规则如下:
在storage槽中第一项是按低位对齐存储(lower-order aligned)
基本类型存储时仅占用其实际需要的字节。
如果基本类型不能放入某个槽位余下的空间,它将被放入下一个槽位。
结构体和数组总是使用一个全新的槽位,并占用整个槽(但在结构体内或数组内的每个项仍遵从上述规则)
优化建议:
为了方便EVM进行优化,尝试有意识排序storage的变量和结构体的成员,从而让他们能打包得更紧密。比如,按这样的顺序定义,uint128, uint128, uint256,而不是uint128, uint256, uint128。因为后一种会占用三个槽位。
Memory - 内存变量的布局(Layout in Memory)
Solidity预留了3个32字节大小的槽位:
0-64:哈希方法的暂存空间(scratch space)
64-96:当前已分配内存大小(也称空闲内存指针(free memory pointer))
暂存空间可在语句之间使用(如在内联编译时使用)
Solidity总是在空闲内存指针所在位置创建一个新对象,且对应的内存永远不会被释放(也许未来会改变这种做法)。
有一些在Solidity中的操作需要超过64字节的临时空间,这样就会超过预留的暂存空间。他们就将会分配到空闲内存指针所在的地方,但由于他们自身的特点,生命周期相对较短,且指针本身不能更新,内存也许会,也许不会被清零(zerod out)。因此,大家不应该认为空闲的内存一定已经是清零(zeroed out)的。
6.2 address
以太坊地址的长度,大小20个字节,160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,也可以随时将一个地址串,得到对应的代码进行调用
event AddMsg(address indexed sender, bytes32 msg);
这行代码声明了一个“事件”。客户端(服务端应用也适用)可以以很低的开销来监听这些由区块链触发的事件
事件是使用EVM日志内置功能的方便工具,在DAPP的接口中,它可以反过来调用Javascript的监听事件的回调。
var event = instance.AddMsg({}, function(error, result) {
if (!error) {
var msg = "AddMsg: " + utils.hex2a(result.args.msg) + " from "
console.log(msg);
console.log('it error')
事件在合约中可被继承。当被调用时,会触发参数存储到交易的日志中(一种区块链上的特殊数据结构)。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在(至少Frontier,Homestead是这样,但Serenity也许也是这样)。日志和事件在合约内不可直接被访问,即使是创建日志的合约。
日志位置在nodedir0/log 里面,可以打出特殊的类型进行验证
数组是定长或者是变长数组。有length属性,表示当前的数组长度。
bytes:类似于byte[], 动态长度的字节数组
string:类似于bytes,动态长度的UTF-8编码的字符类型
bytes1~bytes32一般使用定长的
bytes1~bytes32。在知道字符串长度的情况下,指定长度时,更加节省空间。
6.4.1 创建数组
字面量 uint[] memory a = []
uint[] memory a = new uint[](7);
pragma solidity ^0.4.0;
contract SimpleStartDemo{
uint[] stateV
function f(){
//定义一个变长数组
uint[] memory memV
//不能在使用new初始化以前使用
//VM Exception: invalid opcode
//memVar [0] = 100;
//通过new初始化一个memory的变长数组
memVar = new uint[](2);
//不能在使用new初始化以前使用
//VM Exception: invalid opcode
//stateVar[0] = 1;
//通过new初始化一个storage的变长数组
stateVar = new uint[](2);
stateVar[0] = 1;
6.4.2 数组的属性和方法
length属性
storage变长数组是可以修改length
memory变长数组是不可以修改length
storage变长数组可以使用push方法
bytes可以使用push方法
pragma solidity ^0.4.2;
contract SimpleStartDemo {
uint[] stateV
function f() returns (uint){
//在元素初始化前使用
stateVar.push(1);
stateVar = new uint[](1);
stateVar[0] = 0;
//自动扩充长度
uint pusharr = stateVar.push(1);
uint len = stateVar.
//不支持memory
//Member "push" is not available in uint256[] memory outside of storage.
//uint[] memory memVar = new uint[](1);
//memVar.push(1);
下标:和其他语言类似
6.4.3 Memory数组
如果Memory数组作为函数的参数传递,只能支持ABI能支持的类型类型。
Memory数组是不能修改修改数组大小的属性
pragma solidity ^0.4.2;
contract SimpleStartDemo {
function f() {
//创建一个memory的数组
uint[] memory a = new uint[](7);
//不能修改长度
//Error: Expression has to be an lvalue.
//a.length = 100;
function g(){
b = new uint[](7);
//可以修改storage的数组
b.length = 10;
b[9] = 100;
由于EVM的限制,不能通过外部函数直接返回动态数组和多维数组
将stroage数组不能直接返回,需要转换成memory类型的返回
//Data层数据
struct Rate {
uint[3] exDataA
bytes32[3] exDataS
mapping(int =&Rate) R
function getRate(int key1) public constant returns(int,uint[3],bytes32[3]) {
uint[3] memory exDataInt = Rates[key1].exDataA
bytes32[3] memory exDataStr = Rates[key1].exDataS
return (Rates[key1].unit,exDataInt,exDataStr);
function (&parameter types&) {internal(默认)|external} constant [returns (&return types&)]
6.5.1 函数的internal与external
pragma solidity ^0.4.5;
contract FuntionTest{
function internalFunc() internal{}
function externalFunc() external{}
function callFunc(){
//直接使用内部的方式调用
internalFunc();
//不能在内部调用一个外部函数,会报编译错误。
//Error: Undeclared identifier.
//externalFunc();
//不能通过`external`的方式调用一个`internal`
//Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
//this.internalFunc();
//使用`this`以`external`的方式调用一个外部函数
this.externalFunc();
contract FunctionTest1{
function externalCall(FuntionTest ft){
//调用另一个合约的外部函数
ft.externalFunc();
//不能调用另一个合约的内部函数
//Error: Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
//ft.internalFunc();
访问函数有外部(external)可见性。如果通过内部(internal)的方式访问,比如直接访问,你可以直接把它当一个变量进行使用,但如果使用外部(external)的方式来访问,如通过this.,那么它必须通过函数的方式来调用。
pragma solidity ^0.4.2;
contract SimpleStartDemo {
uint public c = 10;
function accessInternal() returns (uint){
function accessExternal() returns (uint){
return this.c();
6.5.2 函数调用
内部调用,不会创建一个EVM调用,也叫消息调用
外部调用,创建EVM调用,会发起消息调用
6.5.3 函数修改器(Function Modifiers)
修改器(Modifiers)可以用来轻易的改变一个函数的行为。比如用于在函数执行前检查某种前置条件。修改器是一种合约属性,可被继承,同时还可被派生的合约重写(override)
pragma solidity ^0.4.2;
contract SimpleStartDemo {
int256 storedD
event AddMsg(address indexed sender, bytes32 msg);
modifier only_with_at_least(int x) {
if (x &= 5) {
function setData(int256 x) public only_with_at_least(x){
storedData =
AddMsg(msg.sender, "[in the set() method]");
6.5.4合约构造函数
仅能有一个构造器
不支持重载
6.6 Constant
函数也可被声明为常量,这类函数将承诺自己不修改区块链上任何状态。
一般从链上获取数据时,get函数都会加上constant
6.7 继承(Inheritance)
Solidity通过复制包括多态的代码来支持多重继承。
pragma solidity ^0.4.4;
contract Meta {
address metaA
function Meta(string n,string a){
function getMeta()public constant returns(string,string,address){
return (name,abi,metaAddress);
function setMetaAddress(address meta) public {
metaAddress=
pragma solidity ^0.4.4;
import "Meta.sol";
contract Demo is Meta{
bytes32 public orgID;
function Demo (string n,string abi,bytes32 id) Meta(n,abi)
最简单的合约架构
基于EVM的限制,不能通过外部函数返回动态的内容
please keep in mind
Fail as early and loudly as possible
Favor pull over push payments
Order your function code: conditions, actions, interactions
Be aware of platform limits
Write tests
Fault tolerance and Automatic bug bounties
Limit the amount of funds deposited
Write simple and modular code
Don’t write all your code from scratch
Timestamp dependency: Do not use timestamps in critical parts of the code, because miners can manipulate them
Call stack depth limit: Don’t use recursion, and be aware that any call can fail if stack depth limit is reached
Reentrancy: Do not perform external calls in contracts. If you do, ensure that they are the very last thing you do
8. 语言本身存在的痛点
ABI支持的类型有限,难以返回复杂的结构体类型。
Deep Stack的问题
难以调试,只能靠event log ,进行合约的调试
合约调用合约只能使用定长数组
9. 合约架构
合约架构分层
最简单的架构
合约的架构分两层数据合约和逻辑合约
数据合约 【model】逻辑合约
【controller】这样分层的原因,是方便后期合约的升级。
大家都用它,简单易用,生态相对于其他合约框架更加全面
一键初始化开发合约的项目(包含配置)
合约debug【可借鉴】
upgrade smart contract
10. 参考资料
11.相关名词解释:
以太坊合约的代码是使用低级的基于堆栈的字节码的语言写成的,被称为“以太坊虚拟机代码”或者“EVM代码”。代码由一系列字节构成,每一个字节代表一种操作。
UTXO:比特币系统的“状态”是所有已经被挖出的、没有花费的比特币(技术上称为“未花费的交易输出,unspent transaction outputs 或UTXO”)的集合。每个UTXO都有一个面值和所有者(由20个字节的本质上是密码学公钥的地址所定义[1])。一笔交易包括一个或多个输入和一个或多个输出。每个输入包含一个对现有UTXO的引用和由与所有者地址相对应的私钥创建的密码学签名。每个输出包含一个新的加入到状态中的UTXO。
区块链:区块链起源于中本聪的比特币,作为比特币的底层技术,本质上是一个去中心化的数据库。是指通过去中心化和去信任的方式集体维护一个可靠数据库的技术方案。
一起来学习区块链技术吧
3 收藏&&|&&13
你可能感兴趣的文章
入门就这么难,算了这个门我不入了
入门就这么难,算了这个门我不入了
你那里看不懂,可以加一下我,私聊一下。事情不是一蹴而就。
你那里看不懂,可以加一下我,私聊一下。事情不是一蹴而就。
哈哈哈 开个玩笑
@Cristic[critsic]
哈哈哈 开个玩笑
nb。谢谢楼主分享!推荐一个区块链新手入门的以太坊DApp开发教程:
nb。谢谢楼主分享!推荐一个区块链新手入门的以太坊DApp开发教程:
http://xc.hubwiz.com/course/5a952991adbd1?affid=sf
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。【图文】以太坊和智能合约_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
以太坊和智能合约
&&以太坊 智能合约介绍
solidiy 语法介绍
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢保观|专注互联网保险
注:本文是美国世强律师事务所(Steptoe & Johnson LLP)关于区块链技术的系列文章的第一篇。本篇会讨论基于区块链技术的智能合约及其在美国法律框架下的可执行性问题。
智能合约有着颠覆诸多行业的潜力,有些人甚至曾预言2017年将会是&智能合约之年&。智能合约不仅能用于将传统业务流程自动化,它甚至还能创造新的产业和开发新的市场。区块链则是为智能合约提供底层技术支持的最理想平台,因为区块链可以实现&if-then&语句的编程,可以为价值交易提供一个安全而又灵活的交易环境,还可以保存交易细节,并防止交易记录的篡改。
随着越来越多的公司和行业开始探索和尝试基于区块链技术的智能合约的应用,在法律法规上确保智能合约的有效性和执行力就显得越来越重要了。
诸如&基于区块链的合约是否具有法律约束效力,是否能强制执行&等问题早已成为了业界关注的焦点。比如佛蒙特州就已经多次尝试立法,使区块链上的证据能自引为证,最终他们也成功的通过并颁布了相关法律。亚利桑那州最近通过了一项法律,该法律规定,通过区块链技术产生的签名,是具有电子签名效力的。我们认为,《全球暨全美商业电子签章法》(Electronic Signatures in Global andNational Commerce Act,ESIGN,也称电子签名法)和各州根据《统一电子交易法》(Uniform Electronic Transaction Act,UETA)改进的相关法律能够为基于区块链的智能合约提供足够的法律基础。
UETA和ESIGN的发展
在互联网发展的初期,为了满足电商的发展以及保护消费者和商户的利益,美国各州各自颁布了大量法律法规,而不同州之间的法律会出现矛盾。为了解决这些法律上的矛盾,美国统一州法全国委员会(National Conference of Commissioners onUniform State Laws)起草了UETA,为各州的电子签名法律制订提供了参考标准。目前,美国的47个州,以及哥伦比亚特区和美属维京群岛都颁布了基于UETA的法律。
尽管UETA的目的是为全美的电商交易提供统一的法令标准,但是因为每个州各自情况不同,他们在落实UETA时难免会对部分条款有所改动。这也导致企业跨州进行业务时,同样的业务需要满足不同的要求。因此,美国企业积极推动建立新的法律,希望能真正在全国范围内为电子签名以及其他形式的签名建立一个统一、标准、公平的法律。
国会为了满足这一诉求,通过了ESIGN这项法律。ESIGN在很多方面都和UETA类似,但在对消费者意愿的要求等方面则有所不同。国会还在ESIGN中加上了选择权,各州可以自行选择是遵守ESIGN的规定,还是使用UETA的规定。国会就这项选择权做出了详细说明,如果各州自己已经出台了基于UETA的法律,并且该法律和ESIGN没有冲突,则各州可以选择执行自己的法律。这条规定保证了美国各州的电子交易都是受ESIGN或UETA的约束。
UETA和ESIGN中的条款
UETA和ESIGN有以下特征:首先,两部法律都不会因一份签名或记录是电子格式的而认为它是无效的;其次,两部法律都声明,电子记录可以代替纸质记录;最后,电子签名的效力和纸质签名的效力是一样的。这些特征保证了电子记录和电子签名的法定效力与纸质记录和纸质签名是一样的。
这些条款也表明,消费者的意愿可以用电子方式来传达。UETA要求合约双方必须都同意&使用电子方式进行交易&,这种双方都愿意的判断可以是来自&合约内容的规定或是包括双方行为在内的交易环境&ESIGN和UETA也都对电子记录的准确性做出了要求,两份法律都要求电子记录必须精准的反映交易双方同意的内容。
总而言之,UETA和ESIGN的作用就是让数字签名拥有和纸质签名一样的效力。美国国会的愿景是让企业可以通过电子签名实现无纸化办公,提高企业效率,并且不用再费时费力地去管理一屋子的纸质合同。事实上,据当时的国会议事录记载,大家对电子签名的效力都心存忧虑,只有通过国会的立法,人们才能认可电子签名。UETA和ESIGN的出台推动了数字化交易模式的发展,助推了美国数字经济的增长。UETA和ESIGN把信用卡申请,贷款申请以及其他交易都搬到了线上,并且保证了其原有的法律效力。
UETA和ESIGN该如何应用于智能合约?
将UETA和ESIGN应用到智能合约的关键在于区块链的密钥,密钥是用户用来签署和承认其签名的工具。我们认为,区块链的非对称密钥加密属性完美契合了ESIGN和UETA对于电子签名的定义。
简单来说,交易的一方如果想要通过智能合约签署协议,他可以通过密钥进行电子签名。这个通过区块链的非对称密钥加密技术产生的签名,和早期UETA想象的电子签名很像。UETA将&电子签名&定义为&数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据&。所以一份电子签名包含了两个重要组成成分:签名,以及表明认可的意图。
美国法院对上述两个成分的定义比较宽泛。比如法院认为在邮件结尾附上&谢谢&和发件人的姓名,就构成了一个签名。这是一起真实的案件,法院认为原告用键盘手动敲出了自己的姓名,而不是用邮件系统的默认签名,就构成了主动签名的事实。
而在智能合约的体系中,当交易双方最终达成共识后,双方会用各自独一无二的密钥进行签名。密钥就是可以识别签名人身份的数据,而使用密钥签名的行为就表示签名人认可合约的内容。智能合约需要交易双方利用密钥进行签名,这使得智能合约满足了UETA和ESIGN对于电子签名的要求,具备了足够的法律效力。
此外,智能合约体系中,每个人的密钥是独一无二的,这能帮助法院更高效地判断签字人的身份。美国路易斯安纳州鼓励在车险合同中引入电子签名,但在实践中引发了一些矛盾。比如在一起案件中,保险公司手中握有投保人放弃权益的声明,而投保人则表示没有签过此类文件。投保人作为原告将保险公司告上了法庭。保险公司坚称投保人签署了这份声明,而投保人则坚称没有,并表示这份声明的签署日期是在她申请保险的四天之后。这并非个案,相似的情况在其他州也有出现。而这类案件的关键就在于证明签字人的身份。
如果利用智能合约进行类似的合同签订,签字方通过自己独特的密钥进行签字,这样的签字是无法被模仿和伪造的。而且任何第三方在看到这个签名时,都能立刻知道签字方的身份,这也能减少对于签字真实性的争论。有人可能会想,如果密钥被偷了不就能伪造签名了?的确如此,但是为了伪造一份保险合同或其他智能合约而去窃取密钥,对于窃取者来说,成本太高。
将智能合约应用于保险合同,当需要更改受益人时,投保人和保险公司需要重新签订一份智能合约。而智能合约还可以保证投保人按时缴付保费,防止因欠费而导致保单失效的情况出现。智能合约的密钥签名,可以达到第三方见证签名的效力,而且节省下大量的公正费用。同时,密钥签名的高门槛、高可信度也会令上述类似的合同纠纷减少,提高了社会的运行效率。
业内首家互联网保险垂直门户,专注互联网保险前沿资讯。
扫描可关注
出品:凤凰WEMONEY
编辑:谭梦桐}

我要回帖

更多关于 三国协约 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信