智能合约的核心思想、语法重点、编程模式、示例、规范及架构

区块链-智能合约Solidity编程 WeBASE(WeBank Blockchain Application Software Extension)是在区块链应用和FISCO-BCOS节点之间搭建的一套通用组件。围绕交易、合约、密钥管理,数据,可视化管理来设计各个模块,开发者可以根据业务所需,选择子系统进行部署。WeBASE屏蔽了区块链底层的复杂度,降低开发者的门槛,大幅提高区块链应用的开发效率,包含节点前置、节点管理、交易链路,数据导出,Web管理平台等子系统。 阅读详情

目录

什么是智能合约

一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。一个合约由一组代码(合约的函数)和数据(合约的状态)组成,并且运行在以太坊虚拟机上.

以太坊虚拟机(EVM)使用了256比特长度的机器码,是一种基于堆栈的虚拟机,用于执行以太坊智能合约 。由于EVM是针对以太坊体系设计的,因此使用了以太坊账户模型(Account Model)进行价值传输。

合约的代码具有什么能力:

读取交易数据。
读取或写入合约自己的存储空间。
读取环境变量【块高,哈希值,gas】
向另一个合约发送一个“内部交易”。

在区块链平台的架构

区块链平台的架构

1. 什么是solidity

Solidity是一种智能合约高级语言,运行在Ethereum虚拟机(EVM)之上。

solidity 语言特点

它的语法接近于Javascript,是一种面向对象的语言。但作为一种真正意义上运行在网络上的去中心合约,它有很多的不同点:

  • 异常机制,类似于事务的原子性。一旦出现异常,所有的执行都将会被回撤,这主要是为了保证合约执行的原子性,以避免中间状态出现的数据不一致。
  • 运行环境是在去中心化的网络上,会比较强调合约或函数执行的调用的方式。因为原来一个简单的函数调用变为了一个网络上的节点中的代码执行
  • 存储是使用网络上的区块链,数据的每一个状态都可以永久存储。

2. 开发的工具

3 快速入门

3.1 举个例子

完整的步骤:

  1. 写合约
  2. 编译合约
  3. 部署合约
  4. 测试合约

一个例子get demo


    pragma solidity ^0.4.2;
    
    contract SimpleStartDemo {
        int256 storedData;
        event AddMsg(address indexed sender, bytes32 msg);
    
        modifier only_with_at_least(int x) {
           if (x >= 5) {
             x = x+10;
              _;
           }
        } 
        function SimpleStartDemo() {
            storedData = 2;
        }
    
        function setData(int256 x) public only_with_at_least(x){
            storedData = x;
            AddMsg(msg.sender, "[in the set() method]");
        }
    
        function getData() constant public returns (int256 _ret) {
            AddMsg(msg.sender, "[in the get() method]");
            return _ret = storedData;
        }
    }

3.2 部署合约

举个例子get demo

$ babel-node index.js

1. 编译合约

    execSync("solc --abi  --bin   --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 storedData;

详细说明见下文

2. 函数(Functions)

   function setData(int256 x) public {
         storedData = x;
         AddMsg(msg.sender, "[in the set() method]");
     }
   
    function getData() constant public returns (int256 _ret) {
        return _ret = storedData;
     }

3. 事件(Events)

   //事件的声明
   event AddMsg(address indexed sender, bytes32 msg);
   //事件的使用
   function setData(int256 x) public {
         storedData = x;
         AddMsg(msg.sender, "in the set() method");
     }

4. 结构类型(Structs Types)

   contract Contract {
     struct Data {
       uint deadline;
       uint amount;
     }
     Data data;
     function set(uint id, uint deadline, uint amount) {
       data.deadline = deadline;
       data.amount = amount;
     }
   }

5. 函数修饰符(Function Modifiers)

类似于hook modifier only_with_at_least(int x) { if (x >= 5) { x = x+10; _; } }

4. 合约编程模式COP

面向条件的编程(COP)是面向合约编程的一个子域,作为一种面向函数和命令式编程的混合模式。COP解决了这个问题,通过需要程序员显示地枚举所有的条件。逻辑变得扁平,没有条件的状态变化。条件片段可以被正确的文档化,复用,可以根据需求和实现来推断。重要的是,COP在编程中把预先条件当作为一等公民。这样的模式规范能保证合约的安全。

4.1 FEATURES

  • 函数主体没有条件判断

例子:

contract Token {
    // The balance of everyone
    mapping (address => uint) public balances;
    // 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] -= _amount;
        balances[_dest] += _amount;
    }
}

改进后:

function transfer(uint _amount, address _dest) {
    if (balances[msg.sender] < _amount)
        return;
    balances[msg.sender] -= _amount;
    balances[_dest] += _amount;
}

COP的风格

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] -= _amount;
    balances[_dest] += _amount;
}

扩展阅读与学习:

 

5. 语法介绍

基础语法见官方API

5.1 值类型


  • 布尔(Booleans) true false 支持的运算符

    !逻辑非 && 逻辑与 || 逻辑或 == 等于 != 不等于

  • 整型(Integer) int/uint:变长的有符号或无符号整型。变量支持的步长以8递增,支持从uint8到uint256,以及int8到int256。需要注意的是,uint和int默认代表的是uint256和int256

  • 地址(Address): 以太坊地址的长度,大小20个字节,160位,所以可以用一个uint160编码。地址是所有合约的基础,所有的合约都会继承地址对象,也可以随时将一个地址串,得到对应的代码进行调用

  • 定长字节数组(fixed byte arrays)

  • 有理数和整型(Rational and Integer Literals,String literals)

  • 枚举类型(Enums)

  • 函数(Function Types)

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编码。地址是所有合约的基础,所有的合约都会继承地址对象,也可以随时将一个地址串,得到对应的代码进行调用

6.3 event

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);
            return;
        } else {
            console.log('it error')
        }
    });
  • 事件在合约中可被继承。当被调用时,会触发参数存储到交易的日志中(一种区块链上的特殊数据结构)。这些日志与合约的地址关联,并合并到区块链中,只要区块可以访问就一直存在(至少Frontier,Homestead是这样,但Serenity也许也是这样)。日志和事件在合约内不可直接被访问,即使是创建日志的合约。
  • 日志位置在nodedir0/log 里面,可以打出特殊的类型进行验证

6.4 数组

数组是定长或者是变长数组。有length属性,表示当前的数组长度。

  1. bytes:类似于byte[], 动态长度的字节数组

  2. string:类似于bytes,动态长度的UTF-8编码的字符类型

  3. bytes1~bytes32

    一般使用定长的 bytes1~bytes32。在知道字符串长度的情况下,指定长度时,更加节省空间。

6.4.1 创建数组

  1. 字面量 uint[] memory a = []

  2. new uint[] memory a = new uint; 例子

    pragma solidity ^0.4.0;
    
    contract SimpleStartDemo{
      uint[] stateVar;
    
      function f(){
       //定义一个变长数组
        uint[] memory memVar;
    
        //不能在使用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

push方法



storage变长数组可以使用push方法

bytes可以使用push方法

例子

pragma solidity ^0.4.2;

contract SimpleStartDemo {
  uint[] stateVar;

  function f() returns (uint){
    //在元素初始化前使用
    stateVar.push(1);

    stateVar = new uint[](1);
    stateVar[0] = 0;
    //自动扩充长度
     uint pusharr = stateVar.push(1);
     uint len = stateVar.length;
    //不支持memory
    //Member "push" is not available in uint256[] memory outside of storage.
    //uint[] memory memVar = new uint[](1);
    //memVar.push(1);

    return len;
  }
}

下标:和其他语言类似

6.4.3 Memory数组

  1. 如果Memory数组作为函数的参数传递,只能支持ABI能支持的类型类型。

  2. Memory数组是不能修改修改数组大小的属性 例子

    pragma solidity ^0.4.2;

    contract SimpleStartDemo { function f() { //创建一个memory的数组 uint[] memory a = new uint;

         //不能修改长度
         //Error: Expression has to be an lvalue.
         //a.length = 100;
     }
     
     //storage
     uint[] b;
     
     function g(){
         b = new uint[](7);
         //可以修改storage的数组
         b.length = 10;
         b[9] = 100;
     }
    

    }

EVM的限制

由于EVM的限制,不能通过外部函数直接返回动态数组和多维数组

  1. 将stroage数组不能直接返回,需要转换成memory类型的返回
      //Data层数据
      struct Rate {
      		int key1;
            int unit;
            uint[3] exDataArr;
            bytes32[3] exDataStr;
        }
    
        mapping(int =>Rate) Rates;
     function getRate(int key1) public constant returns(int,uint[3],bytes32[3]) {
            uint[3] memory exDataInt = Rates[key1].exDataArr;
            bytes32[3] memory exDataStr = Rates[key1].exDataStr;
            return (Rates[key1].unit,exDataInt,exDataStr);
        }

业务场景

 

 

扩展阅读与学习:

 

6.5 函数

function () {internal(默认)|external} constant [returns ()]

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){
            return c;
        }
        
        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 storedData;
        event AddMsg(address indexed sender, bytes32 msg);
    
        modifier only_with_at_least(int x) {
           if (x >= 5) {
             x = x+10;
              _;
           }
        } 
        function setData(int256 x) public only_with_at_least(x){
            storedData = x;
            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 {
        string  public name;
        string  public abi;
        address metaAddress;
    
        function Meta(string n,string a){
            name=n;
            abi=a;
        }
       
        function getMeta()public constant returns(string,string,address){
            return (name,abi,metaAddress);
        }
       
        function setMetaAddress(address meta) public {
            metaAddress=meta;
        }    
    }

子类

    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)
        {
        	orgID = id;
        }
    }

最简单的合约架构

7. 限制

基于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. 语言本身存在的痛点

1. ABI支持的类型有限,难以返回复杂的结构体类型。
2. Deep Stack的问题
3. 难以调试,只能靠event log ,进行合约的调试
4. 合约调用合约只能使用定长数组

9. 合约架构

合约架构分层

最简单的架构

1->1合约架构图

合约的架构分两层数据合约和逻辑合约
model:数据合约
controller:逻辑合约
这样分层的原因,是方便后期合约的升级。

获取更多合约架构详情

truffle框架

优势

大家都用它,简单易用,生态相对于其他合约框架更加全面

功能

  • 一键初始化开发合约的项目(包含配置)
  • 合约编译
  • 合约部署
  • 合约测试
  • 合约debug【可借鉴】

upgrade smart contract

10. 参考资料

 

11.相关名词解释:

  1. 以太坊合约的代码是使用低级的基于堆栈的字节码的语言写成的,被称为“以太坊虚拟机代码”或者“EVM代码”。代码由一系列字节构成,每一个字节代表一种操作。
  2. UTXO:比特币系统的“状态”是所有已经被挖出的、没有花费的比特币(技术上称为“未花费的交易输出,unspent transaction outputs 或UTXO”)的集合。每个UTXO都有一个面值和所有者(由20个字节的本质上是密码学公钥的地址所定义[1])。一笔交易包括一个或多个输入和一个或多个输出。每个输入包含一个对现有UTXO的引用和由与所有者地址相对应的私钥创建的密码学签名。每个输出包含一个新的加入到状态中的UTXO。
  3. 区块链:区块链起源于中本聪的比特币,作为比特币的底层技术,本质上是一个去中心化的数据库。是指通过去中心化和去信任的方式集体维护一个可靠数据库的技术方案。

转自:https://segmentfault.com/a/1190000012996636

透明可升级代理的缺陷与UUPS改进方案 智能合约的可升级性是区块链开发中的重要概念,通过代理模式实现逻辑与数据分离。其核心原理是代理合约通过delegatecall转发调用到逻辑合约,使合约在保持地址不变的情况下实现功能升级。这种技术在DApp开发中具有重要价值,既能修复漏洞又能适应需求变化,广泛应用于DeFi、NFT等场景。OpenZeppelin的透明代理(Transparent Proxy)是常见实现,但存在函数选择器冲突等安全隐患。UUPS(Universal Upgradeable Proxy Standard)作为改进方案,将升级逻辑 阅读详情

相关推荐

HTTP 402区块链化:x402协议安全攻防与Agentic支付实践

HTTP状态码是Web通信的基础规范,其中402状态码设计用于内容付费场景,但因传统支付集成复杂而长期未被启用。区块链技术通过智能合约实现了去中心化、可编程的支付逻辑,为协议层原生支付提供了技术基础。这种将经济激励嵌入网络协议层的设计,能够实现微支付、资源访问控制等自动化场景,显著提升互联网服务的价值交换效率。x402协议正是这一理念的实践,它复活了HTTP 402状态码,将其转变为由智能合约驱动的动态支付流程。在工程实践中,协议安全至关重要,特别是针对价格预言机操控和支付重放等经典攻击向量,需要结合时间加

weixin_33377602的博客 266

Solidity 智能合约基础入门(第一章)

Solidity是一种面向智能合约的编程语言,用于开发以太坊区块链上的去中心化应用(DApps)。它是以太坊平台的官方语言,并且在其他一些区块链平台中也被广泛采用。Solidity语言结合了C++、JavaScript和Python的特性,其语法类似于这些语言,使开发者更容易上手。使用Solidity,开发者可以定义和执行智能合约,这些合约定义了在区块链上运行的一系列代码和规则。智能合约用于管理和控制区块链上的资产和交互行为。

2202_76125312的博客 2736

Arbitrum Nitro 技术栈解析:从 Geth 核心到 WASM 证明的 3 层架构演进

本文深入解析了Arbitrum Nitro技术栈的三层架构设计,从Geth核心到WASM证明的演进过程。通过复用Geth代码实现高效执行,结合ArbOS中间件和WASM证明机制,Nitro在Optimistic Rollup赛道中展现出卓越的性能与安全性。文章详细探讨了架构设计、技术实现及性能优化策略,为开发者提供全面的技术参考。

weixin_42552410的博客 255

区块链之智能合约快速入门

以太坊是一个平台,它上面提供各种模块让用户来搭建应用,如果将搭建应用比作造房子,那么以太坊就提供了墙面、屋顶、地板等模块,用户只需像搭积木一样把房子搭起来,因此在以太坊上建立应用的成本和速度都大大改善。具体来说,以太坊通过一套图灵完备的脚本语言(Ethereum Virtual Machinecode,简称EVM语言)来建立应用,它类似于汇编语言。我们知道,直接用汇编语言编程是非常痛苦的,但以太坊里的编程并不需要直接使用EVM语言,而是类似C语言、Python、Lisp等高级语言,再通过编译器转成EVM语言。上面所说的平台之上的应用,其实就是合约,这是以太坊的核心。合约是一个活在以太坊系统里的自动代理人,他有一个自己的以太币地址,当用户向合约的地址里发送一笔交易后,该合约就被激活,然后根据交易中的额外信息,合约会运行自身的代码,最后返回一个结果,这个结果可能是从合约的地址发出另外一笔交易。需要指出的是,以太坊中的交易,不单只是发送以太币而已,它还可以嵌入相当多的额外信息。如果一笔交易是发送给合约的,那么这些信息就非常重要,因为合约将根据这些信息来完成自身的业务逻辑。合约所能提供的业务,几乎是无穷无尽的,它的边界就是你的想象力,因为图灵完备的语言提供了完整的自由度,让用户搭建各种应用。白皮书举了几个例子,如储蓄账户、用户自定义的子货币等。 2013年年末,以太坊创始人Vitalik Buterin发布了以太坊初版白皮书,启动了项目。2014年7月24日起,以太坊进行了为期42天的以太币预售。2016年初,以太坊的技术得到市场认可,价格开始暴涨,吸引了大量开发者以外的人进入以太坊的世界。中国三大比特币交易所之二的火币网及OKCoin币行都于2017年5月31日正式上线以太坊。 [1] 自从进入2016年以来,那些密切关注数字货币产业的人都急切地观察着第二代加密货币平台以太坊的发展动向。作为一种比较新的利用比特币技术的开发项目,以太坊致力于实施全球去中心化且无所有权的的数字技术计算机来执行点对点合约。简单来说就是,以太坊是一个你无法关闭的世界计算机。加密架构与图灵完整性的创新型结合可以促进大量的新产业的出现。反过来,传统行业的创新压力越来越大,甚至面临淘汰的风险。比特币网络事实上是一套分布式的数据库,而以太坊则更进一步,她可以看作是一台分布式的计算机:区块链是计算机的ROM,合约是程序,而以太坊的矿工们则负责计算,担任CPU的角色。这台计算机不是、也不可能是免费使用的,不然任何人都可以往里面存储各种垃圾信息和执行各种鸡毛蒜皮的计算,使用它至少需要支付计算费和存储费,当然还有其它一些费用。最为知名的是2017年初以摩根大通、芝加哥交易所集团、纽约梅隆银行、汤森路透、微软、英特尔、埃森哲等20多家全球top金融机构和科技公司成立的企业以太坊联盟。而以太坊催生的加密货币以太币近期又成了继比特币之后受追捧的资产。  智能合约的潜在应用很多。彭博社商业周刊称它是“所有人共享但无法篡改的软件”。更高级的软件有可能用以太坊创建网络商店。区块链程序以太坊可以用来创建去中心化的程序、自治组织和智能合约,据纽约时报的报导,在2016年5月已经有数十个可用的程序。预期的应用目标涵盖金融、物联网、农田到餐桌(farm-to-table)、智能电网、体育,菠菜等。去中心化自治组织有潜力让许多原本无法运行或成本过高的营运模型成为可能。较知名的应用有:去中心化创业投资:The DAO用以太币资金创立,目标是为商企业和非营利机构创建新的去中心化营业模式、The Rudimental让独立艺术家在区块链上进行群众募资。社会经济平台:Backfeed。去中心化预测市场:Augur。物联网:Ethcore(一间以太坊公司)研发的客户端、Chronicled(一间区块链公司)发表了以太坊区块链的实物资产验证平台;芯片公司、物理IP创建者和生产者可以用植入的蓝牙或近场通信进行验证。Slock.It开发的智能锁可以在付费后自动打开,让用户在付费后可以帮电动车充电、或是打开租屋的房门。虚拟宝物交易平台:FreeMyVunk。版权授权:Ujo Music平台让创作人用智能合约发布音乐,消费者可以直接付费给创作人。伊莫珍·希普用此平台发布了一首单曲。智能电网:TransActive Grid让用户可以和邻居买卖能源。去中心化期权市场:Etheropt。钉住汇率的代币:DigixDAO提供与黄金挂钩的代币,在2016年四月正式营运。Decentralized Capital提供和各种货币挂钩的代币。移动支付:Everex让外劳汇款回家乡。客户端软件以太坊的两个主要的客户端软件是Geth和Parity。企业软件企业软件公司也正测试用以太坊作为各种用途。已知有兴趣的公司包括微软、

【0基础】学习solidity开发智能合约-初识solidity

solidity入门课程,初识solidity

外柏叁布道者 6873

可信数据空间赋能电力数据安全流通:从理论架构到“电费贷“实践

电力数据作为关键生产要素,其安全高效流通是数字经济时代的必然要求。通过构建"防控风险+激活价值"双轨体系,基于交互式双链区块链技术实现电力数据的可信交易,我们不仅能解决当前电力数据交易面临的核心困境,更能为整个能源行业的数据要素市场建设提供可复制、可推广的实践路径。未来,随着可信数据空间的不断完善,电力数据将在更多领域释放价值,驱动能源行业的数字化转型与高质量发展。

getusushu的博客 36

智能合约【简介】

什么是智能合约、智能合约的发展背景、智能合约的优势、智能合约的劣势、智能合约的一些应用

尽欢的博客 7373

系统架构师备考指南:考前动员

系统架构师备考的要点和考卷情况分析,现在正好是做学习规划的好时机。

老郑的博客 1265

【Web3开发者必备技能】:构建可升级智能合约的3种主流方案

掌握可升级的区块链智能合约构建方案,解决代码不可变难题。详解代理模式、模块化设计和标准接口三大方法,适用于DeFi与NFT项目,提升灵活性与安全性。Web3开发进阶必读,值得收藏。

CodeWhim的博客 362

百度贴吧爬虫实战:完整实现与使用指南

使用 csv 模块创建写入器,首先写入表头("标题" 和 "链接"),然后遍历帖子字典,将每个标题和链接作为一行写入文件。首先检查内容是否为空,然后通过查找 JSON 结构的起始({)和结束(})位置,提取有效的 JSON 片段。接着遍历帖子列表中的每个条目,提取标题文本和对应的链接,对于相对路径的链接会自动补全为完整的 URL。从 JSON 提取标题和链接此方法专门用于从解析后的 JSON 数据中提取帖子标题和对应的链接。提取到的标题和链接以字典形式返回,键为标题,值为对应的完整链接。

qq_63736560的博客 2018

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

智能合约安全审计的自动化测试框架与用例生成优化

实验数据显示,在DeFi合约测试中,该算法发现新型重入漏洞的数量是传统方法的3.2倍(图1)。基于规则的测试用例生成是当前主流方法,但存在覆盖面不足的缺陷。实验数据表明,综合应用形式化验证与博弈论优化,可使漏洞发现效率提升3-5倍,同时降低30%以上的人力成本。主流工具对比显示(表2),Slither在静态分析准确率(98.7%)上领先,但动态测试速度(12.3s/合约)落后于Oyente(7.8s/合约)。测试表明,该方法在智能合约测试中,关键路径覆盖度从61%提升至89%,同时减少冗余测试用例35%。

2501_92440701的博客 841

Landsat9 地表温度反演方法

landsat9地表温度反演及缺失值处理方法

xiangliu12345的博客 3919

形式化方法入门:定义、核心思想

形式化方法(Formal Methods)是一种基于数学逻辑的系统开发与验证方法,它通过严格的数学符号、模型和推理规则,对软件 / 硬件系统进行描述、建模、验证和实现,从根源上消除设计缺陷和逻辑错误。和传统的 “经验式开发 + 测试验证” 不同,形式化方法的核心是 “用数学证明代替经验判断”—— 它不仅能验证系统 “没有出现已知错误”,更能证明系统 “永远不会出现某类错误”。

zu_11的博客 276

ESP32-C61 eFuse控制器深度解析:寄存器架构与安全烧写实践

eFuse(电子熔丝)是嵌入式芯片实现硬件级不可逆配置与信任根构建的核心物理机制,其本质是通过电学编程固化关键安全参数。原理上依赖熔丝单元的单向导通/断开特性,结合Reed-Solomon纠错、多级写保护和时序可控编程,保障数据在宽温域与工艺偏差下的高可靠性。技术价值在于为Secure Boot、Flash加密、密钥隔离等安全功能提供可信锚点,支撑从启动到运行的全链路防护。典型应用场景涵盖物联网设备量产烧录、安全启动使能、MAC地址固化及抗DPA密码运算配置。本文聚焦ESP32-C61平台,深入解析其eFu

weixin_42589700的博客 123

数字电视中的 Closed Caption (CC) 字幕标准协议

本文将详细介绍 DVB中的 CC 字幕标准协议,包括数据结构格式、字段定义、字段占用比特数以及字段用途。此外,本文还将举例说明如何从 TS 传输流中解析 CC 字幕信息,并组织打包到电视节目中进行显示。

以实战经验介绍行业知识 670

区块链智能合约&恶意交易2022-2024相关论文及idea

这篇论文介绍了一种名为BlockScope的工具,旨在检测和调查从比特币和以太坊传播到其分叉项目中的漏洞。作者发现了101个先前未知的漏洞,并对漏洞的传播和修补过程进行了深入调查。研究结果显示,比特币的分叉项目发布修补程序的延迟通常很长,大多数超过200天,而以太坊的分叉项目的修补程序发布延迟相对较短,大部分在100天左右。方法论:作者提出了一种基于补丁的克隆检测方法,用于在分叉项目中检测易受攻击的代码克隆。

eliforsharon的博客 5944

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 936

Move智能合约规格推断:机械规则与AI语义的融合之道

形式化验证是确保智能合约安全性的关键技术,它要求开发者编写精确的规格说明来定义函数行为。传统基于静态分析的机械式推断通过预定义规则扫描代码,能可靠推导资源所有权、数值边界等基础规格,但难以理解业务语义。而基于大语言模型的智能体式推断则能理解代码意图,生成高层业务不变式,却存在幻觉风险。将两者结合,构建分阶段流水线——先用机械分析锚定确定性规格,再以AI补充语义层推断,最后进行冲突校验——能实现优势互补。这种融合策略通过Model Context Protocol等机制构建丰富上下文,为Move等区块链语言的

weixin_30808693的博客 406

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

大数据在电力行业的应用案例解析-【电力技术】(九)大数据在电力储能运维中的深度应用(含故障预测代码)

大数据技术为电力储能运维提供了“精准化、智能化、高效化”的解决方案,破解了传统运维的核心痛点,实现了储能系统从“被动抢修”到“主动运维”的转型,为新型电力系统建设提供了重要支撑。当前,随着储能产业的快速发展,大数据与储能运维的融合将更加深入,未来将结合人工智能、物联网、区块链等技术,实现储能运维的全流程智能化——从设备故障的提前预警,到寿命的精准预测,再到运维策略的自动优化、调度协同的实时响应,进一步提升储能系统的安全性、经济性与可靠性。

getusushu的博客 88

Aptos区块链开源项目安全实践:从理论到实战的完整指南

2023年初,一个基于Aptos的去中心化金融应用在部署后不到一周内遭遇了严重的安全事件。攻击者通过精心构造的交易,绕过了合约的权限检查机制,成功转移了价值数百万美元的资产。事后分析发现,问题根源并非区块链底层漏洞,而是智能合约开发者忽视了Move语言特有的所有权模型,导致权限边界模糊。 这个案例揭示了一个残酷的现实:即使底层区块链技术如Aptos这样经过严格安全审计,应用层的安全漏洞仍然可能造

gitblog_00866的博客 977

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

「区块链」:web3.0的底层引擎-大白话详解

密码学是钢筋水泥,保证了数据不可篡改,身份不可伪造。共识机制是施工法则,让一群陌生人能协同盖出摩天大楼。网络架构是路网水管,让信息和价值能高效流动。智能合约是房间里的智能家电,实现了复杂的自动化功能。扩展方案是高架桥和地铁,最终让这栋大楼能容纳亿万大众。对于咱们支付人来说,这不是一场革命,而是一次范式转移。它不是在重复造轮子,而是在造新的交通工具。无国界、低成本、可编程、即时结算。现在,发动机的蓝图已经在我们手里了。是继续围观,还是开始动手组装,选择权在每一个人手里。参考文献。

xuezhongrenleima的博客 1667

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

去中心化人工智能(DeAI)核心架构解析:从概念到工程实践

人工智能(AI)的发展正从集中式范式向分布式协作演进。其核心原理在于通过区块链、密码学与分布式系统技术,将模型训练、推理和数据管理从中心化实体分散到网络参与者手中,以此构建开放、可验证的AI生态系统。这一转变的技术价值在于解决了数据隐私、模型所有权和创新门槛等核心痛点,为AI开发与应用带来了透明性和抗审查性。在应用场景上,它催生了去中心化的模型市场、联邦学习协作网络以及由社区治理的AI服务。本文聚焦于去中心化人工智能(DeAI)的实现路径,深入剖析其构建模块,包括基于智能合约的协调、去中心化身份与模型注册表

weixin_30522095的博客 157

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Qtum量子链帅初出席POW'ER 2019全球开发者大会,从技术创新到长远价值

8月21日,Qtum量子链创始人帅初应邀参加由火星财经主办的“POW’ER 2019全球开发者大会”。此次开发者大会邀请来自全球的70位区块链、5G、AI、云计算、大数据、物联网等领域的技术领袖、专家学者、投资及研究机构负责人,共同分享他们对新技术趋势和商业机遇的判断和展望。 会上,Qtum量子链创始人帅初发表了《2019年公有链的技术发展和反思》主题演讲,回顾了区块链技术发展十年历程...

weixin_42667079的博客 265
上一篇: 浅谈以太坊智能合约的设计模式与升级方法
下一篇: 以太坊DApp开发入门教程——Node.js和truffle框架打造区块链投票系统
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值