Solidity原理(三):abi编码以及与EVM交互的原理

solidity0.7.1以上本地编译部署配置 由于truffle的solc list 最高只有0.7.1,笔者使用的是0.8.0,因此有了本文 一、solc 1.安装solcjs npm install solc 2.官方文档 GitHub - ethereum/solc-js: Javascript bindings for the Solidity compiler 3. Compile.js 用于编译合约,生成bytecode和abi const fs = require("fs"), s... 阅读详情

1.   如何生成smart contract对应的ABI(ApplicationBinary Interface)

函数的abi由以下元素组成

1)     Type:有“function”,“constructor”, “fallback”三种

2)     Name:函数名

3)     Inputs:函数的参数类型,参数名,components(tuple类型才会有)

4)     Output:函数的返回值,名字(可省略)

5)     Payable:函数是否是payable的

6)     StateMutability:pure/view/nonpayable/payable 这四种的一种

7)     Constant:如果是pure或者view,则为true,否则为false

Event的abi由以下元素组成:

1) Type:“event”

2) Name:event的名字

3) Inputs:event的参数类型,参数名,components(tuple类型才会有),indexed(参数是否被indexed关键字修饰,indexed会给该参数一个编码,方便事件过滤)

4) Anonymous:是否声明为anonymous,如果声明为anonymous, 事件的签名不会被保存为topic,也就是说无法通过事件名称过滤该事件

 

从abi的生成规则来看,可以直接通过源码来获得abi,以下是个合约对应的abi

pragma solidity ^0.4.0;
contract Test {
  function Test() public { b = 0x12345678901234567890123456789012; }
  event Event(uint indexed a, bytes32 b);
  event Event2(uint indexed a, bytes32 b);
  function foo(uint a) public { Event(a, b); }
  bytes32 b;
}

2-14行对应的是函数foo,16-21是构造函数的abi,22-38,39-56分别是事件Event, Event2对应的abi

 

通过Web3,Remix等工具,可以直接生成合约的abi

 

 

 

2.   使用ABI调用合约函数,并获取返回值的原理

在使用ABI调用合约函数时,传入的ABI会被编码成calldata(一串hash值,编译过程见3.)。calldata由function signature和argument encoding两部分组成。通过读取call data的内容, EVM可以得知需要执行的函数,以及函数的传入值,并作出相应的操作。

Call Data: 是除了storage,memory的另一个数据保存位置,保存了inputdata。长度是4bytes+32bypes*n.可通过CALLDATALOAD,CALLDATASIZE, CALLDATACOPY等指令进行操作

EVM读取并执行call data的规则如下:

a.      函数选择器: Call data的前4个bytes对应了合约中的某个函数。因此EVM通过这4个bytes, 可以跳转到相应的函数。

ByteCode中的体现:

  

上面左边两张图是合约bytecode最开始的部分,EVM依次执行每条命令,当执行到CALLDATASIZE(L6)时,EVM读取input的size(读取的是function的hash, 长度为4bytes)。L7会和4进行比较,作为L9的JUMPI的跳转条件

l  input的size比4小,则跳转到fallback function(fallback function是唯一一个没有名字的函数)。跳转的地址是由L8 push到栈中的,跳转的地址是6d,转换成10进制为109,也就是L42。

l  input的size长度为4,则会继续执行每个指令。L11的CALLDATALOAD会从读取input的具体值,与L18,23,28,33,38的hash值(该合约中的函数签名)进行比较,以L18为例,L19会比较input的函数签名与L18的哈希值是否相等。如果相等,则跳转到L20表明的地址(PC:8d),否则继续执行,直到遇到函数签名相等的情况为止

l  如果没有一个函数签名相等(此时执行到L41),因为没有执行到终止命令,如stop。EVM会继续往下执行L42,L42是fallback function的起始位置。因此fallback function的执行情况是:

A contractcan have exactly one unnamed function. This function cannot have arguments andcannot return anything. It is executed on a call to the contract if none of theother functions match the given function identifier. Furthermore, this functionis executed whenever the contract receives plain Ether (without data). 

   

functionchangeState(bool newState, uint value) returns(uint) {

              value++;

              GambleState = newState;

              return value;

}


b.      参数读取:

call data是32bytes的整数倍(头4 bytes的函数签名除外),EVM通过CALLDATALOAD指令,每次能从call data中读取32byte的值,放入stack中。上面的图通过2个CALLDATALOAD分别读出了newState和value的值,放入了stack中。通过JUMP指令跳转到函数体(tag19),并继续执行。

 

c.      返回值:

当函数结束完时,会跳转到tag18。Tag 18最末尾的RETURN指令,下面是RETURN指令的实现。RETURN指令会从stack中读取两个值,通过这两个值从memory中读取相应的值,以返回给调用方。DAPP端具体如何获得RETURN值在4中回答

 

3.   ABI是如何编码的

a.      函数编码:在EVM中,每个函数都由4个byte长度的16进制值来唯一标识,这4个bytes叫做函数签名。函数签名是对函数名,函数参数做Keccak(SHA-3) 运算后,获得的hash值的前4个bytes.

如下面increaseAge这个函数,直接通过web3提供的sha3,取前4bytes即可获得函数签名F9EA5E79. EVM会通过这个函数签名找到对应的函数,通过JUMPI跳转到对应的函数。

functionincreaseAge(string name, uint num)returns (uint){

       return ++age;

}


b.      函数参数编码:

每个参数都是以一个32byte长度hash值的形式传入的,长度不够用0补,如uint8的长度是8bytes,前面不足的24bytes都用0来补。用下面的合约来举例:

pragma solidity ^0.4.16;
contract Foo {
    function baz(uint32 x, bool y) public pure returns (bool r) { r = x > 32 || y; }
  function bar(bytes3[2]) public pure {}
  function sam(bytes, bool, uint[]) public pure {}
}

1) baz函数:0xcdcd77c0是bar的函数签名,如果要传入69和true两个参数,69首先会被编码成0x0000000000000000000000000000000000000000000000000000000000000045,true则被编码成0x0000000000000000000000000000000000000000000000000000000000000001,最后总的传入参数为0xcdcd77c0 0000000000000000000000000000000000000000000000000000000000000045 0000000000000000000000000000000000000000000000000000000000000001,一共68bytes。

这个函数会返回一个bool类型的值,假设返回值是false,那么在调用方会收到

0x0000000000000000000000000000000000000000000000000000000000000000

2) bar函数:假设要传入的值为[“abc”,”def”],”abc”对应的hash值为0x6162630000000000000000000000000000000000000000000000000000000000,”def”对应的值为0x6465660000000000000000000000000000000000000000000000000000000000,bytes采用的是左端对齐的方式,以区分uint

3) sam函数:存在两个动态类型bytes和uint[],对于动态类型在编码时,会先存入一个32bytes的值,代表这个动态类型的长度。比如要传入[1,2,3],会先编码一个0000000000000000000000000000000000000000000000000000000000000003,表示接下来有3个uint的值

 

4.   如何使用abi与smart contract进行交互

Web3是以太坊提供的一个库,提供了Python,js,java等版本。它能够在DAPP端使用ABI与smart contract进交互(调用合约以及获得返回值内容)。换句话说,当dapp端调用smart contract的某个函数时,web3的作用就是把abi通过网络发送给Ethereum的node。Node接收到abi之后,编译成hash值并且执行。Node把执行完的结果上传到区块链。如果有返回值,再Node通过网络的方式返回给DAPP。

DAPP端在与合约进行交互之前,需要与以太坊进行连接,连接方式有IPC与RPC。

IPC(Inter-process Communications)在使用前必须同步数据,因为该模式下是通过本地的数据进行运行的,所以返回值直接同本地获得。使用方法:同步完数据后,开启geth ipc。在dapp端连接ipc服务后,与smart contract进行交互。

RPC(Remote Procedure Call)通过网络连接,与远程的Ethereum node进行交互。执行的结果通过网络发送。使用方法:geth --rpc --rpcaddr<ip> --rpcport <portnumber> 命令开启rpc服务,在dapp端连接到ip:portnumber之后,即可用web3与smart contract进行交互。

面向开发人员的 Solidity:使用Solidity进行ABI编码和解码 面向开发人员的 Solidity:使用Solidity进行ABI编码和解码 智能合约基本上由状态变量和函数组成。有些函数是私有的,只能从合约内部访问,但许多函数是公共的,可以从合约外部访问。也就是说,应用程序(和人)可以向合约发送数据并从合约中检索数据。 要将数据发送到合约,我们需要以合约可以读取的方式发送数据。也就是说,它们需要被编码。如何执行这种编码的规则由以太坊虚拟机(EVM)的实现定义。 在本文中,我们将学习一些关于编码规则的知识,以及如何使用solidity对必须作为函数参数发送的数据进行编码 阅读详情

相关推荐

关于EVM 和 solidity语言一些内部机制的研究

以下都是来自我的新作《解密EVM机制及合约安全漏洞》里的内容 电子版PDF下载:https://download.youkuaiyun.com/download/softgmx/10800947     1.EVM有寄存器吗? 答:没有 2.智能合约地址有私钥吗? 答:没有 3.合约调用是怎样传参的?以及返回值又怎样传递的? 答: 值参传递:                    返回...

softgmx的博客 9134

Solidity极简入门#27. ABI编码解码

当你想省空间,并且不与合约交互的时候,可以使用abi.encodePacked,例如算一些数据的hash时。ABI被设计出来跟智能合约交互,他将每个参数填充为32字节的数据,并拼接在一起。abi.decode用于解码abi.encode生成的二进制编码,将它还原成原本的参数。​功能类似,只不过第一个参数为函数选择器,为函数签名Keccak哈希的前4个字节。​,用于解码abi.encode的数据。​对编码进行了压缩,长度比abi.encode短很多。​功能类似,只不过第一个参数为函数签名,比如"​。

sleep的博客 1896

用通俗易懂的话来讲以太坊虚拟机、Solidity、Vyper、ConsenSys、Truffle、MetaMask、Ropsten、Remix、Guestbook、ABI、Etherscan、payl

摘要:以太坊生态是一个去中心化的计算网络,核心由EVM虚拟机驱动,确保全球节点执行结果一致。开发者使用Solidity(主流)或Vyper(安全优先)编写智能合约,通过Truffle等工具编译测试,部署到Ropsten测试网验证后上线主网。用户通过MetaMask钱包与DApp交互,交易数据编码为Payload由EVM执行,所有操作公开记录在Etherscan。ConsenSys提供开发工具链(如Remix、Infura),形成从编码到部署的完整工作流。该生态通过Gas机制、沙盒隔离等技术保障安全,支持构建

通俗易懂学IT 926

第七集:Solidity abi字段说明

  Type:方法类型,主要包括functino, constructor, fallback,默认情况下,代表function Constanst:布尔值,如果是true指明方法,不会修改合约内部的状态变量 Name:方法名 Inputs:方法参数,数组,数组中每一个对象都是针对一个参数的说明 Name:参数名称 Type:参数类型 Outputs:和inputs一样 Payable...

super_lixiang的博客 340

以太坊虚拟机 EVM 的原理

作者:禅与计算机程序设计艺术 1.背景介绍 什么是EVM? 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个运行在以太坊区块链网络上执行智能合约、存储数据的软件。它负责部署、验证、执行智能合约的代码,并维护所有账户信息。用

AI天才研究院 1757

2.08---什么是 ABI?为什么前端调用需要它?

【摘要】ABI(应用二进制接口)是智能合约与外部交互的核心桥梁,定义了函数调用、事件日志等交互规范。本文系统解析ABI的结构(函数/事件/构造器)、编码原理(函数选择器、动态类型处理)及工程实践(多语言SDK支持、事件解码、调试工具),并通过Ethers.js示例展示前端调用流程。对比Web2的API文档,ABI是Web3开发不可或缺的合约说明书,确保链上链下数据正确编解码,是跨合约调用和多语言互通的基石。

鄙人kunzhi96,感恩遇见! 2万+

Solidity 生成不可重复随机数源码

场景 在合约中某些时候需要生成不可重复的随机数,比如NFT的TokenId由已开始的自增序列改为散列随机出现在可允许的范围内。就像开盲盒一样,可以随机开出。同时以太坊的随机数安全性是未知的,因为生成随机数的所有数值在生成之前都是可见的。如果需要生成真随机数可以使用”预言机“。 代码 contract TestHash{ //散列随机数的范围,此处为6,表明最终的随机数范围 [1,6] uint constant public TOKEN_LIMIT = 6; //散列数组,用

topc2000的博客 5842

ABI 编码,快速

斋戒快速编码和解码 abi 数据。用法constRUST_ENCODER=newFastABI(ABIasMethodAbi[]);constcallData=RUST_ENCODER.encodeInput('sampleSellsFromUniswapV2',[ ...values]);// 0x.....// Decode the output of a method callconstoutput=RUST_ENCODER.decodeOutput('sampleSellsFromUniswapV2',callData);// {// router: '0x6b175474e89094c44da98b954eedeac495271d0f',// path: [ '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' ],// takerTokenAmounts: [ 1, 2, 3 ]// }性能 Uniswap ABI 13 input encode ✓ ZeroEx - optimized (2

【02】智能合约与虚拟机

Solidity代码优化器实际上是基于opcode的,也就是基于汇编来进行优化的;优化器会试图简化复杂的代码逻辑或公式,从而减少代码量和Gas消耗;优化器会在JUMP和JUMPDEST处将opcodes拆分为一个个独立的基本代码块;这些代码块是原子的,即要么完成,要么不完成,不会在运行一半的时候跳跃(JUMP)到其他地方;编译器会在各个原子代码块中寻找等效替代;如将x-y替换为一个非零常量。

FrancyZhou的博客 1756

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 873

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南)

本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。

weixin_28481133的博客 290

Web3.swift智能合约ABI编码解码实战:从理论到代码示例的深度指南

在以太坊生态系统中,智能合约与外部应用的交互离不开ABI(Application Binary Interface)。Web3.swift作为纯Swift编写的以太坊Web3库,提供了完整的ABI编码解码解决方案,让iOS开发者能够轻松实现智能合约交互。本文将从理论基础到代码实践,全面解析Web3.swift的ABI处理机制,帮助开发者快速掌握智能合约数据编解码技术。 ## 一、ABI基础:智能

gitblog_00260的博客 355

Apple CarPlay Certification Guide December 2022 解析V1.0

Apple CarPlay Certification Guide December 2022更新说明

m0_74450450的博客 703

Solidity原理(六):用solc编译smart contract,用evm反编译bytecode

首先需要安装solc和evmsolc:https://github.com/ethereum/solidity/releasesevm: https://geth.ethereum.org/downloads/编译一个smart contract可以通过指令 solc --bin-runtime filepath来得到bytecode反编译bytecode可以通过evm --dissam b...

Programmer_CJC的博客 6410

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1722

AMCL代码详解(六)amcl中的重采样

每次都从w1左边的竖线开始转,显而易见,转到w1的概率为0-w1之间的随机数,转到w2的概率为w1到w1+w2之间的随机数,转到w3的概率为w1+w2到w1+w2+w3之间的随机数,后面的依次类推。当某个粒子的权值较大的时候,产生的随机数落在相应区间的概率就会增大,从而实现了对权值大粒子的多次复制,权值小的粒子的剔除。可以看出,在整个重采样的过程中,粒子进行了两次种情况的刷新,一种是随机生成的新的粒子,一种是对原来的粒子的复制。得到的值越大,说明粒子的权重越小,当前粒子的可信度比较小,需要重采样粒子。

YiYeZhiNian的博客 1579

EVM.Codes核心功能解析:Opcode查询、合约编译与执行模拟全攻略

想要深入了解以太坊虚拟机(EVM)的工作原理吗?EVM.Codes是一个终极的以太坊虚拟机操作码交互式参考工具,为开发者提供完整的Opcode查询、智能合约编译与执行模拟功能。这个免费的开源工具让学习EVM变得简单直观,无论是区块链新手还是资深开发者都能快速掌握EVM的核心机制。 ## 🚀 为什么选择EVM.Codes? EVM.Codes是目前最全面的以太坊虚拟机学习平台,它提供了三大核心

gitblog_00838的博客 1021

Ubuntu 22.04 搭建 PX4 飞控系统完全指南:从仿真到硬件试飞

定义消息文件protobufuint64 timestamp # 时间戳float32 temperature # 温度float32 humidity # 湿度生成代码:bashPX4 在 Ubuntu 22.04 的搭建涉及环境配置、编译仿真、硬件连接等多环节,核心是理解 PX4 1.14 的新特性(uXRCE-DDS、动态控制分配)。通过本文指南,开发者可快速构建稳定的 PX4 开发环境,为无人机应用开发奠定基础。

zqmgx13291的博客 3040

Solidity——速通学习

这一讲,我们介绍了什么是函数选择器selector),它和msg.data函数签名的关系,以及如何使用它调用目标函数。在这一讲,我们介绍了如何在Solidity使用try-catch只能用于外部合约调用和合约创建。如果try执行成功,返回变量必须声明,并且与返回的变量类型相同。

qq_46573670的博客 2627

RAP BDL 里的 field ( readonly ) 到底控制了什么?——从语法到运行时的全景解析

RAP行为定义中的只读字段控制 摘要:该代码片段展示的是RAP(ABAP RESTful Application Programming)行为定义语言(BDL)中的字段控制语法,用于声明业务对象中需由框架自动维护的只读字段。field ( readonly )语句将订单ID和审计字段(CreatedBy/CreatedAt等)标记为只读,确保这些字段在更新阶段不可修改。在managed场景下,RAP框架会自动处理这些行政性数据的写入:创建时填充创建信息,更新时刷新变更记录,并利用LocalLastChang

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 157

「自然语言驱动生产力」17. 秒出端子图:DeepSeek+EPLAN实现机柜布线自动化——电气工程设计的效率革命

摘要:在电气工程设计领域,机柜布线与端子图绘制长期依赖人工操作,存在效率低、易出错等痛点。本文提出基于DeepSeek大模型与EPLAN软件的集成方案,通过自然语言指令驱动自动化设计流程。实验表明,该方案可将PLC柜端子图绘制从传统3小时压缩至2分钟,线号标注准确率达100%,BOM表实现实时导出。文中详细阐述了系统架构、IO配置解析算法、端子排自动生成逻辑及线缆优化策略,提供了完整的Python实现代码与污水处理厂鼓风机控制柜的实际应用案例,验证了自然语言驱动技术在电气工程设计中的实用价值。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2049

以太坊虚拟机EVM的工作原理是怎样的

在底层,EVM 使用一组指令(称为操作码)来执行特定任务。

lucasma的博客 1812

Devexpress16.2.6破解工具

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

详解Solidity中的事件

Solidity事件是智能合约与外部应用通信的关键机制,作为区块链的低成本"广播系统",通过日志记录状态变化。相比状态变量存储,事件具有Gas效率高、支持前端异步监听、便于数据审计和调试等优势。事件使用emit触发,参数可标记为indexed以便过滤(最多3个)。底层通过EVM的LOG操作码实现,数据存储在交易回执中。前端可通过web3.js订阅或查询历史事件,获取包含参数值、区块信息等详细数据的Event对象。开发者还可创建匿名事件或使用事件重载功能。合理使用事件能显著提升DApp性能

1041

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

深入了解以太坊虚拟机第4部分——ABI编码外部方法调用的方式

本文由币乎社区(bihu.com)内容支持计划赞助。在本系列的上一篇文章中我们看到了Solidity是如何在EVM存储器中表示复杂数据结构的。但是如果无法交互,数据就是没有意义的。智能合约就是数据和外界的中间体。在这篇文章中我们将会看到Solidity和EVM可以让外部程序来调用合约的方法并改变它的状态。“外部程序”不限于DApp/JavaScript。任何可以使用HTTP RPC与以太坊节点通信...

omnispace的博客 2414

Solidity随笔

"内置函数"的更严谨的说法应该是“全局变量”abi.encodeWithSelector是将4字节函数选择器和参数进行编码。参考:Solidity极简入门: 29. 函数选择器Selector4字节函数选择器就是把函数签名(函数名+参数名)编码为4个字节的字节码可用于选择调用的函数参考:简书-Solidity Call函数这里的token.call是底层的合约调用方法,不建议用。推荐的方法是通过接口实例化后调用。

海豹姥爷的博客 1086

Solidity 大神之路之内功修炼第五章

本文深入探讨Solidity开发的五大核心知识点: 函数签名:详细解析selector生成机制与abi.encode系列编码方法,揭示跨合约调用的动态实现原理; 低级调用:对比call、delegatecall和staticcall的特性差异,分析其在代理模式与安全查询中的应用; unchecked关键字:展示如何通过禁用溢出检查实现gas优化,强调安全使用前提; 存储原理:系统讲解Storage布局规则,包括静态变量打包、动态数据存储

web3 1196
上一篇: Solidity原理 (二):库(Library)(待修改)
下一篇: Solidity原理(四):从Bytecode角度分析,EVM如何在基本块之间跳转
Programmer_CJC
博客等级 码龄11年 37粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值