如何计算EOS代码和ABI的哈希

万向区块链技术研究报告 | EOS.IO技术调研 区块链技术迅猛发展,新想法、新概念、新名词层出不穷。万向区块链因此推出“技术研究报告”专栏,定期与大家分享在区块链行业创新及热门技术方面的研究成果,带领大家第一时间研究学习新技术,紧跟技术发展趋势,探索发掘技术的应用价值。 在《EOS.IO技术调研》一文中,我们分享关于EOS.IO概况、共识、出块、验证等方面的研究情况。 本文作者:通用架构技术部 吴超尘 简介 技术组成 EOS.IO 背景 开发团队 BM 成功项目 BitShare(基于区块链技术. 阅读详情

如果你想知道在EOS上部署了什么版本的智能合约,你需要查看代码哈希。我们将看到如何计算代码和ABI哈希,并编写一个函数,通过比较它们的哈希来查看本地WASM文件是否与正在运行的协议相匹配。

EOS代码的哈希

当通过eosio setcode操作设置或更新合约时,检查合约代码是否已经在运行。因此,通过查看setcode实现,我们可以从WASM文件看到如何计算哈希值。

void apply_eosio_setcode(apply_context& context) {
   // some setup code

   fc::sha256 code_id; /// default ID == 0

   if( act.code.size() > 0 ) {
     code_id = fc::sha256::hash( act.code.data(), (uint32_t)act.code.size() );
     wasm_interface::validate(context.control, act.code);
   }

   const auto& account = db.get<account_object,by_name>(act.account);

   int64_t code_size = (int64_t)act.code.size();
   int64_t old_size  = (int64_t)account.code.size() * config::setcode_ram_bytes_multiplier;
   int64_t new_size  = code_size * config::setcode_ram_bytes_multiplier;

   EOS_ASSERT( account.code_version != code_id, set_exact_code, "contract is already running this version of code" );

   // ...
}

这只是一个简单的WASM字节表示的sha256哈希值。(第二个参数只是字节数组的长度,哈希函数需要它来知道要对多少字节进行哈希处理。)

在node.js中,我们可以通过哈希一个WASM文件并将其与区块链上代码的哈希值进行比较来轻松实现这一点。

const fs = require(`fs`)
const crypto = require(`crypto`)

const loadFileContents = file => {
    if (!fs.existsSync(file)) {
        throw new Error(`Code file "${file}" does not exist.`)
    }

    // no encoding => read as Buffer
    return fs.readFileSync(file)
}

const createHash = contents => {
    const hash = crypto.createHash(`sha256`)
    hash.update(contents)
    const digest = hash.digest(`hex`)

    return digest
}

// fetch code contract from blockchain
const { code_hash: onChainCodeHash, abi_hash } = await api.rpc.fetch(`/v1/chain/get_raw_abi`, {
    account_name: `hello`,
})
const contents = loadFileContents(`contracts/hello.wasm`)
const codeHash = createHash(contents)

if (codeHash === onChainCodeHash) {
    console.log(`Code is up-to-date.`)
}

get-raw-abi函数是一个很好的API端点,可以通过一个查询同时获取帐户的代码和abi哈希。

注意,WASM文件和代码哈希依赖于编译期间使用的eosio cpp版本和-o优化参数。来自同一个C++代码,代码哈希可能是不同的。

EOS ABI 的哈希

我们可以尝试同样的方法来计算ABI哈希,但是,由于某种原因,eosio setabi操作不检查ABI哈希,因此允许使用相同的哈希进行更新。

但是get-raw-abi-api端点返回一个abi哈希,因此必须从某个地方获取它。通过检查nodeos-chain插件,我们可以看到它是为每个请求动态计算的:

read_only::get_raw_abi_results read_only::get_raw_abi( const get_raw_abi_params& params )const {
   get_raw_abi_results result;
   result.account_name = params.account_name;

   const auto& d = db.db();
   const auto& accnt = d.get<account_object,by_name>(params.account_name);
   result.abi_hash = fc::sha256::hash( accnt.abi.data(), accnt.abi.size() );
   result.code_hash = accnt.code_version;
   if( !params.abi_hash || *params.abi_hash != result.abi_hash )
      result.abi = blob{{accnt.abi.begin(), accnt.abi.end()}};

   return result;
}

计算结果与ABI字节表示的代码哈希 - SHA256 完全相同。然而,实际存储ABI的方式有一个很大的区别。它不是作为熟悉的JSON文件存储的,而是作为EOS称之为原始ABI的打包方式存储的。

从raw abi转换为json很容易使用eosjs,但是从json转换为raw abi需要一些nb的操作:

const {Serialize, Api} = require(`eosjs`)
const {TextEncoder, TextDecoder} = require(`util`) // node only; native TextEncoder/Decoder

const jsonToRawAbi = json => {
    const tmpApi = new Api({
        textDecoder: new TextDecoder(),
        textEncoder: new TextEncoder(),
    })
    const buffer = new Serialize.SerialBuffer({
        textEncoder: tmpApi.textEncoder,
        textDecoder: tmpApi.textDecoder,
    })

    const abiDefinition = tmpApi.abiTypes.get(`abi_def`)
    // need to make sure abi has every field in abiDefinition.fields
    // otherwise serialize throws
    const jsonExtended = abiDefinition.fields.reduce(
        (acc, {name: fieldName}) => Object.assign(acc, {[fieldName]: acc[fieldName] || []}),
        json,
    )
    abiDefinition.serialize(buffer, jsonExtended)

    if (!Serialize.supportedAbiVersion(buffer.getString())) {
        throw new Error(`Unsupported abi version`)
    }
    buffer.restartRead()

    // convert to node buffer
    return Buffer.from(buffer.asUint8Array())
}

每个ABI必须包含一组特定的字段,如version、types、structs、actions、tables,即版本、类型、结构、操作、表等,然后将这些字段序列化为更大的有效表示形式。

计算ABI哈希并用链上的值检查它是很简单的:

const contents = loadFileContents(`contracts/hello.abi`)

const abi = JSON.parse(contents.toString(`utf8`))
const serializedAbi = jsonToRawAbi(abi)

const abiHash = createHash(serializedAbi)

// fetch abi hash from blockchain
const { code_hash, abi_hash: onChainAbiHash } = await api.rpc.fetch(`/v1/chain/get_raw_abi`, {
    account_name: `hello`,
})

if (abiHash === onChainAbiHash) {
    console.log(`ABI is up-to-date.`)

    return null
}

======================================================================

分享一些比特币、以太坊、EOS等区块链相关的交互式在线编程实战教程:

  • EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • 深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • c#比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在C#代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是C#工程师不可多得的比特币开发学习课程。
  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • Hyperledger Fabric 区块链开发详解,本课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、通道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、nodejs链码与应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。
  • Hyperledger Fabric java 区块链开发详解,课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、频道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、java链码与应用开发的操作实践,是java工程师学习Fabric区块链开发的最佳选择。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创转载请标明出处。这里是如何计算EOS代码和ABI的哈希

什么是Ricardian Contract李嘉图合约? Ricardian Contracts是数字文档,用于定义两方或多方之间交互的条款和条件。 在20世纪90年代,伊恩·格里格(Ian Grigg)在寻找创造数字化现金的愿景的朋友之后学会了资产的数字化。Ian Grigg发现债券数字化的必要性,并试图在互联网上发行相同的债券,因为它们也是金融资产,而世界正在开始通过互联网创建业务。在努力解决问题的过程中,Ian Grigg开发了李嘉图合约。 李嘉... 阅读详情

相关推荐

EOS Platform 7.0 开发实战手册

EOS Platform,作为区块链领域的一股新兴力量,以其高并发、低延迟以及易扩展的特性,迅速赢得了行业内的高度关注。自推出以来,不断迭代更新,EOS Platform 7.0 版本的发布,更是标志着区块链技术在企业级应用中的重要进展。本章节将对EOS Platform 7.0的整体架构、功能特色及其在企业应用中的潜力进行全面的概述。

weixin_36019375的博客 1151

eosjs 文档(Serialize接口)

Serialize接口 Action 属性 account:string 定义于eosjs-serialize.ts:92 authorization:Authorization[] 定义于eosjs-serialize.ts:94 data:any 定义于eosjs-serialize.ts:95 name:string ...

weixin_34143774的博客 281

【高级-RAG-优化方法】

本文介绍了两种优化RAG(检索增强生成)系统的高级方法。第一部分介绍KnowFlow项目,它采用父子分块技术,将文档分为父分块(800-1500字符)和子分块(200-400字符),通过精确匹配子分块再返回父分块内容来保证搜索精确性和上下文完整性。第二部分探讨Milvus的多种增强技术,包括查询增强(如假设问题生成、回溯提示)、索引增强(自动合并块、分层索引)、检索器增强(句子窗口检索、元数据过滤)、生成器增强(提示压缩、块排序)以及管道增强(自我反省、代理查询路由)。这些方法共同提升了RAG系统的检索效率

weixin_48585108的博客 958

eosjs使用说明文档

eosjs使用说明文档 本使用说明基于EOSIO 1.0.22版本,最新版的教程请参考这里 版本说明: Version EOSIO/eosjs Npm EOSIO/eos Docker Node dawn4.2 tag: 13.x.x npm install eosjs(version 13) tag: dawn-v4.2.0 eos...

q_776355102的博客 5898

802.1AS-2011_Gptp协议栈

GPTP(广义时钟同步协议,或IEEE 802.1AS)的基本功能是确保局域网中所有的时钟都同步,并提供时间信息。这种协议用于在局域网中进行同步和时间对齐,其目的是确保网络中各设备的时间一致性。

weixin_49041703的博客 2540

深入理解C++23的Deducing this特性(上):基础概念与语法详解

C++23标准中引入的"Deducing this"特性是一项重大革新,它不仅改变了我们编写成员函数的方式,还为模板元编程和设计模式实现带来了新的可能。

weixin_61470881的博客 1332

智能合约 web3.js ABI Address三者的关系

web3.js是以太坊提供的一个Javascript库,它封装了以太坊的JSON RPC API,提供了一系列与区块链交互的Javascript对象和函数,包括查看网络状态,查看本地账户、查看交易和区块、发送交易、编译/部署智能合约、调用智能合约等,其中最重要的就是与智能合约交互的API。下面就介绍如何使用web3.js提供的接口调用智能合约。系统和软件Ubuntu 16.04 64位 nodej...

Pony Chen's Blog 9097

阻抗匹配详解

在深入理解阻抗匹配概念之前,我们可以先来一起看一个现象,首先使用一个信号发生器输出一个脉宽为 50ns 的单脉冲信号,同时将信号接入示波器,此时在示波器的波形视图上可以看到这个仅有一个脉冲的信号,如下图。如果我们将信号接入示波器的同时将电缆延长数米到外部,并且延长后电缆末端保持悬空不接入任何东西,引出一段未接入任何东西的开路电缆,按照常识应该没有任何影响,然而实测是在原有脉冲旁边多出了一个类似脉冲,如下图。

zhbi98 的技术 Blogs 2556

EOS签名算法分析

def sig_digest(payload, chain_id=None, context_free_data=None) : ''' ''' if chain_id : buf = bytearray.fromhex(chain_id) else : buf = bytearray(32) # already a bytearray buf.extend(payload) if context_free_data :

yqq1997的博客 457

一文理解近红外光谱数据建模步骤的细节(细节知识总结)

上一篇文章,向入门的同志大体介绍了近红外光谱数据建模的内容,依据上文其实已经可以基本完成数据建模的工作,但是很多工作不够细致,本文便是分享其中的一些技术细节。

weixin_46207310的博客 5567

【25届数字IC秋招总结】面试经验10——紫光同芯

25届数字ic面试记录——紫光同芯

lalala0635的博客 862

EOS 智能合约

1. EOS智能合约的介绍 1.1. 所需背景知识 C / C++ 经验 基于EOS.IO的区块链使用Web Assembly(WASM)执行开发者提供的应用代码。WASM是一个已崭露头角的web标准,受到Google, Microsoft, Apple及其他大公司的广泛支持。目前为止,最成熟的用于构建应用及WASM代码编译的工具链是clang/llvm及其C/C++编译器。 其他由第三方...

Fly_鹏程万里 683

【自适应滤波】自适应UKF,基于新息自适应调节Q和R,场景为雷达跟踪与滤波、MATLAB实现

本文提出了一种基于新息协方差匹配的自适应UKF(CM-AUKF)算法,用于解决噪声统计未知或时变场景下的目标跟踪问题。通过实时调整过程噪声协方差Q和观测噪声协方差R,CM-AUKF显著提升了跟踪精度和稳定性。仿真结果表明,相比传统UKF,CM-AUKF在位置和速度估计误差上分别降低了约50%和30%,且无需人工调参。该算法适用于无人机导航、雷达跟踪等动态环境,MATLAB代码可直接运行复现结果。自适应曲线显示算法能有效收敛到真实噪声参数,验证了其自适应能力。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 329

C++编写MCP网关必须绕开的7个ABI陷阱:GCC 12/Clang 16 ABI不兼容、std::string SSO差异、虚函数表偏移……

避开7大ABI陷阱,保障C++编写高吞吐量MCP网关的跨编译器兼容与性能稳定。覆盖GCC 12/Clang 16 ABI差异、std::string SSO实现分歧、虚函数表偏移等实战痛点,适用于金融低延迟网关场景。值得收藏

CompiTide的博客 387

uniapp - 如何跟内嵌 web-view 组件内的网页交互,与 web-view 内嵌网页进行双向通信(uniapp 与 webview 网页之间的 “相互“ 传值)提供详细的示例代码及解决方案

uni-app如何实现在H5环境中与web-view中的网页交互通讯uniappuni-app 与 web-view内嵌网页 双向通信 如何跟内嵌web-view交互uniappAPP与webview子页面交互uniappAPP与webview子页面交互关于uni-app 使用 web-view 页面之间互相跳转、通信等问题uniapp的web-view嵌入网页,网页与uniapp通信webview如何与uniapp写的H5页面交互嵌套webview调用uniapp各种API组件实现H5和app通讯和交互

✅ 精选推荐文章 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JDK8-HashMap源码,面试官轮轮虐你

1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

m0_61549740的博客 397

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【以太坊源码go-ethereum阅读】error.go

【代码】【以太坊源码go-ethereum阅读】error.go。

深漂小码哥 204

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

viem源码解析:深入理解TypeScript以太坊接口实现原理

viem是一个**轻量级、可组合、类型安全**的TypeScript以太坊接口库,为开发者提供了与以太坊区块链交互的现代化解决方案。作为以太坊生态中最受欢迎的TypeScript工具库之一,viem通过模块化设计和优秀的类型系统,极大地简化了以太坊开发流程。本文将深入解析viem的源码架构和核心实现原理,帮助开发者更好地理解这个强大的工具库。 ## viem项目架构概览 viem采用**模块化

gitblog_00107的博客 870

听 GPT 讲 Go-Ethereum 源代码 (18)

分享更多精彩内容,欢迎关注! File: trie/tracer.go 在go-ethereum项目中,trie/tracer.go文件是Merkle Patricia Trie(MPT)的调试和追踪器。它的主要作用是在trie的各种操作(插入、删除、读取等)期间,帮助开发人员了解底层存储数据结构的交互,并提供有关操作的详细信息。 该文件中定义了几个结构体,分别是:newTracer、onRead、onInsert、onDelete、reset、copy、markDeletions。 newTrace

techdashen的博客 841

计算机运维基础知识 Linux版

计算机系统由硬件系统和软件系统组成第一代计算机 电子管时代第二代计算机 晶体管时代第三代计算机 集成电路时代第四代计算机 大规模集成电路时代1964年,世界第一代计算机ENICA。用来计算弹道轨迹。冯诺依曼 计算机之父运算器,控制器,存储器,输入设备,输出设备。巨型计算机,大型计算机,小型计算机,微型计算机。服务器Server/client C/S是计算机的...

weixin_33940102的博客 245

ZoKrates安全最佳实践:避免零知识证明开发中的10个常见陷阱

🚀 **ZoKrates** 是专为以太坊设计的零知识证明(zkSNARKs)工具箱,它让开发者能够轻松创建可验证的计算程序,并在区块链上生成和验证证明。作为零知识证明开发的关键工具,掌握ZoKrates的安全最佳实践至关重要。本文将为您揭示10个最常见的开发陷阱,并提供实用的解决方案,帮助您构建安全可靠的零知识证明应用。 ## 🔍 1. 忽视字段溢出风险 在ZoKrates中,所有计算都

gitblog_00553的博客 139
上一篇: Quorum企业以太坊环境搭建教程
下一篇: Hyperledger Fabric 开发环境安装
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值