译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3] 本文是关于调试 EVM 智能合约系列的第 2 篇,本系列包含 7 篇文章: 第 1 篇:汇编表示[4] 第 2 篇:部署智能合约 更确切地说,复制智能合约代码从Stack(2)个字节到Stack(2)+Stack(1)个字节。看一下堆栈,这是位于0x22(=34 的十进制)和(22+3f=61,即 97 的十进制)之间的代码。 这是我们存储在 EVM 内存中的智能合约的代码。因此,交易数据的第 0x22 字节(十进制 34)之后的每一整块字节都是智能合约的代码! 让我们部署这个智能合约,参数 a=1,b=2,msg.value=1 ether,设置与之前一样(启用优化器, runs 设置为 1,solidity 0.8.7)。 智能合约结束了它的执行。 总结 最后总结一下合约部署情况: 它像每个智能合约一样存储了空闲内存指针。 它复制了由交易数据提供的 2 个参数,并将其存储到内存中。
目标合约漏洞分析这次的攻击目标依然是获得 HackMe 合约中的 owner 权限,我们可以看到两个合约中除了 HackMe 合约中的构造函数可以修改合约的 owner 其他地方并没有修改 owner 的函数,但是却可以修改位置slot0的值,而HackMe 合约中插槽slot0表示的便是Lib的地址,那么我们就先修改Lib的地址为我们的地址,再次调用HackMe 合约时就会运行我们合约中的逻辑,那么想改哪个位置插槽的值不就都由我们控制了吗 攻击合约下面是我们本次的攻击合约:接下来我们来看看攻击的整个逻辑:1. Attack.attack() 函数先将自己的地址转换为 uint256 类型(这一步是为了兼容目标合约中的数据类型)第一次调用 HackMe.doSomething() 函数;2. 如果想了解更多的智能合约和区块链知识,欢迎到区块链交流社区CHAINPIP社区,一起交流学习~社区地址:https://www.chainpip.com/
required items must be unique recovered虽然 Fabric v2.2 已经发布了很久了,但之前因为项目历史问题,一直使用的都是 Fabric v1.4.8,所以智能合约也一直使用的都是 在合约开发过程中,我一般都是使用下面的接口格式来定义合约的业务逻辑: func create(stub shim.ChaincodeStubInterface, payload string) ([] byte, error)在开发 Fabric v2.2 的智能合约时, 使用 github.com/hyperledger/fabric-contract-api-go/contractapi 替换 github.com 接口格式如下: func create(ctx contractapi.TransactionContextInterface, payload string) ([]byte, error)然而这样的接口在合约示例化的时候翻车了
漏洞概述 在 solidity 中合约之间的相互调用有两种方式: 使用封装的方式,将合约地址封装成一个合约对象来调用它的函数 直接使用函数来调用其他合约 solidity 提供了 call()、delegatecall (方法选择器,arg1,arg2,...) ()"))); 这样就调用了 secret 第二个例子 contract sample2{ ... receiver.call.value(0)(bytes4(keccack256(_custom_fallback)),_from,_amount,_data); } 代码含义:如果目标地址是智能合约 #code 由于这个合约的计算比较多,所以在 Gas limit 值加上个 0 让他大一点 点击 owner 查看合约所有者的地址,返回了默认账户的地址 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
基于区块链的智能合约最近引起了广泛的关注,因为最终他们可以完全自主启动,且支持自我监控的对等网络(P2P)安全保障模式,为所有物联网链接的产品租赁提供便利。 什么是智能合约? 智能合约,又称加密合约,是在一定条件下可以直接控制数字货币或资产在各方之间转移的一种计算机程序。 存储和执行智能合约 比特币和以太坊在智能合约的存储和执行方面存在差异。以太坊用户通过事物将智能合约加载到包含合约逻辑的有效负载网络中。 事务不发送到特定的地址,相反,网络上处理事务的节点识别“ 智能合约有效负载”,并创建一个智能合约地址。 智能合约的优势 智能合约为个人用户提供了许多必要的优势,其中包括: 自主性:使用智能合约意味着由您来达成协议:无需依赖经纪人、律师、或者其他机构进行确认。
一、说明 在上一篇文章中分享了智能合约的安装与使用,如果业务有变更代码需要修改怎么办呢?本文分享如何对已安装的合约进行版本更新。 二、环境准备 区块链网络安装:《Hyperledger Fabric 2.x 环境搭建》 智能合约安装:《Hyperledger Fabric 2.x 自定义智能合约》 执行以下命令,可以看到已安装的合约信息 .org1 和 peer0.org2 两个机构安装合约: peer lifecycle chaincode install mycc.tar.gz 执行以下命令,重新查看已安装的合约信息: peer \ --sequence 2 「package-id」 需填入新安装的 Package ID 「sequence」 因为是审批第二个合约,所以需要填 2 「version」 只是标识符,可改可不改 --output json 返回: { "approvals": { "Org1MSP": true, "Org2MSP": true } } 六、重新提交 执行以下命令,向通道提交合约
详解 EOS 智能合约的 cpp 文件 之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能合约所有的业务逻辑内容都是在 , asset value, const currency_stats& st ) { //建立一个 multi_index,用来操作数据库 //这里的参数 _self 表示数据的拥有者为智能合约本身 issuer_can_recall; s.can_whitelist = issuer_can_whitelist; }); } transfer(转账)函数 transfer 应该是这个智能合约最常用的函数 , transfer, {st.issuer,N(active)}, {st.issuer, to, quantity, memo} ); } } 设置 action 大家知道 EOS 系统的智能合约是以 ------------------------------------------------------------------------------ 相关文章和视频推荐 【许晓笛】 EOS 智能合约案例解析
智能合约 Solidity里的智能合约是面向对象语言里的类。它们持久存放在状态变量和函数中,(在里面)可以通过solidity修改这些变量。 在不同的智能合约(实例)中调用一个函数(的过程),(实际上)是在EVM(Ether虚拟机)中完成一次调用,并且完成(一次)上下文切换,(此时)状态变量是不可访问的。 , Base2 { } Final.kill() 将调用Base2.kill作为最后的派生重写,但这个函数绕开了Base1.kill。 Base2, Base1 { } 若Base1 调用了super函数,它不是简单地调用基本合约之一的函数, 它是调用最后继承关系的下一个基本合约的函数。 所以它会调用 base2.kill()(注意,最后的继承顺序是–从最后的派生合约开始:Final, Base1, Base2, mortal, owned)。
以太坊则是“图灵完备的”,让我们就像使用任何高级语言一样来编写几乎可以做任何事情的程序(智能合约)。 EVM(Ethereum Virtual Machine)以太坊虚拟机是以太坊中智能合约的运行环境。 而EVM运行在以太坊节点上,当我们把合约部署到以太坊网络上之后,合约就可以在以太坊网络中运行了。 以太坊虚拟机上运行的是合约的字节码形式,需要我们在部署之前先对合约进行编译。 (钱包)理解为一个开发者工具,它提供账户管理、挖矿、转账、智能合约的部署和执行等等功能。 智能合约的部署是指把合约字节码发布到区块链上,并使用一个特定的地址来标示这个合约,这个地址称为合约账户。 合约部署之后,当需要调用这个智能合约的方法时只需要向这个合约账户发送消息(交易)即可,通过消息触发后智能合约的代码就会在EVM中执行了。
我们可以看到,账户检查(在这个例子中)分为这五类: 帐户所有权检查(1,2,4,5) 帐户类型检查(1、2、4、5) 账户实例检查(某种账户类型的正确实例是否被传入)(2,5) 账户签名检查(3) 程序账户地址检查 显然,处理 6 个账户比处理 2 个对象更麻烦,特别是如果你考虑到还需要为账户实现账户检查。可以说这仍然是可控的,但是当我们开始在一个单一的调用中把多个不同的智能合约组合在一起时会发生什么? 至于方案(2),其想法是将整个 Move VM 作为 Solana 程序(智能合约)来运行。 但是,到目前为止,智能合约的执行在 Solana(在写这篇文章的时候,平均有 3k TPS)和 Sui(基于团队所做的最初 e2e 基准)上都没有成为瓶颈。提高交易处理性能的关键是并行执行。 首先是 Move 智能合约的开发时间要快得多。看起来,在 Move 中从头开始开发一个智能合约可能比在 Rust 中快 2-5 倍。
一、说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制;智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑。 本文分享如何使用 Java 语言开发智能合约,以及合约的安装与使用。 为机构peer0.org2安装合约 执行以下命令,设置 peer0.org2 环境: export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE 为机构peer0.org2审批合约定义 执行以下命令,设置 peer0.org2 环境: export CORE_PEER_LOCALMSPID="Org2MSP" export CORE_PEER_TLS_ROOTCERT_FILE ==", "collections": {}, "approvals": { "Org1MSP": true, "Org2MSP": true } } 九、测试智能合约 交易数据使用
它标榜成为世界的计算机,然后在这台世界计算机上运行的就是智能合约,智能合约相当于后台程序,和前端程序一组合(sdk/rpc)也就是这里的DApp。 智能合约和 DApp 大侠留步,智能合约(Smart Contract)是个什么东西,和AI有关系?嗯,没半毛钱关系。 ? 公平 去中心的智能锁 区块链上的智能合约承载了原来中间商信任担保的角色,也是我们常常说的“去中介”和“去信任”的由来。 整体的实现逻辑如下: 房东通过智能合约 Smart Lock Contract 设置房屋租金。 在这个游戏当中,你可以收藏,交易和繁殖以太喵,有别于比特币这类加密货币,以太喵更像加密收藏品,这意味着你的 CryptoKitty 始终属于你,合法性由智能合约(Smart Contract)确定,而智能合约是无法关停的
像区块链行业的许多想法一样,一般的混乱笼罩着所谓的“智能合约”。 智能合约是基于二代区块链平台正在研发的内置模块,实现自动化的掌控资产的转移。 智能合约使得合约处理过程自动化,由于不需要任何第三方托管机构介入,从而提高合约执行效率,节省费用,任何相关方或合约的一方,在合约条款失效前都无法控制或更改资产,保证了合约的可靠性及安全性,使合约方几乎可以做到零纠纷 智能合约0.0.png 在一个简单的例子中,以太坊用户可以使用智能合约在特定日期向朋友发送10以太。 在这种情况下,用户将创建一个合同,并将数据推送到该合同,以便它可以执行所需的命令。 智能合约的运作方式 值得注意的是,在网络可以将价值从一个人转移到另一个人的意义上,比特币是第一个支持基本智能合约的人。节点网络仅在满足某些条件时才验证事务。 但是,比特币仅限于货币使用案例。 数量上的优势 推断最后一点,智能合约可能需要其他智能合约的帮助。 当有人在炎热的夏天对温度进行简单的下注时,可能会触发一系列合约。
漏洞分析 以太坊智能合约的特点之一是能够调用其他外部合约的代码,然而这些外部合约可能被攻击者劫持,迫使合约通过回退函数进一步执行代码,包括回调本身。 但是有个问题是他没有先对用户的代币余额进行清零,而智能合约进行转账的时候会调用收款方 fallback 函数 合约可以有一个未命名的函数 —— Fallback 函数。 如果在一个到合约的调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据),那么这个函数(fallback 函数)会被执行。 另外每当合约收到以太币(没有任何数据),这个函数就会执行。 如果不存在这样的函数,则合约不能通过常规交易接收以太币 如果构造一个 fallback 函数,函数里面也调用对方的 withdraw 函数的话,那将会产生一个循环调用转账功能,存在漏洞的合约会不断向攻击者合约转账 若外部函数是被攻击者所操纵的合约,就存在隐患 外部函数操作优先于对状态的写操作 防范的关键在于编写合约的时候把写操作放在外部函数调用之前
译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3] 照片来自Unsplash[4] 背景 区块链技术正在改变各行各业的游戏规则,而智能合约是这一进程的关键部分 本指南将引导你了解审计智能合约的基础知识和一些常见的智能合约漏洞。 第 1 部分:为什么要审计你的智能合约? 智能合约之所以重要,有很多原因。 第 3 部分:智能合约审计的不同阶段 智能合约审计的不同阶段包括: 确定审计的目标和目的: 这一步你要设定智能合约审计的目标和目的。 例如,假设你试图计算一个智能合约中所有代币的总价值。每个代币的价值被存储为一个整数。如果合约中的代币超过 2,147,483,647 个,那么总价值将太大,无法使用一个整数变量完整表示。 the-ultimate-smart-contract-auditing-guide-ddec6e78e7dc 参考资料 [1] 登链翻译计划: https://github.com/lbc-team/Pioneer [2]
0 Solidity和智能合约Solidity开发可运行的智能合约步骤:源代码通过编译成字节码(Bytecode),同时会产生二进制接口规范(ABI)通过交易将字节码部署到以太坊网络,部署成功会产生一个智能合约账户通过 web3.js+ABI去调用智能合约中的函数来实现数据的读取和修改下面开始简单例子入手Solidity。 hdkey } from 'ethereumjs-wallet'其他常用接口light.js - 为轻客户端优化的高级反式JS库flex-contract 和 flex-ether - 零配置的高级库,用于与智能合约进行交互并进行交易 0x742d35Cc6634C0532925a3b844Bc454e4438f44e')2.2 Web3j:Java Ethereum Dapp API轻量级、高度模块化、反应式、类型安全的Java和Android库,用于处理智能合约并与以太坊网络上的客户端 die("Unable to connect.");}其它Nethereum - .Net Web3Ethereum.rb - Ruby Web3Eventeum - 由Kauri用Java编写的以太坊智能合约事件和后端微服务之间的桥梁
很好 那就是智能合约 智能合约 智能合约(Smart Contract)是一种基于区块链技术的自动化合约。它是一段程序代码,可以在区块链上执行、验证和执行合约的条款和条件。 智能合约的执行过程: 创建合约:首先,有一个人(创建者)使用一笔特殊的交易(称为合约创建交易)来部署合约。这笔交易包含了合约的字节码(即合约的编译后代码)和其他必要参数。 按照上面的思路 我们开心的学完solidity 就能愉快的编写合约啦 但是 我们需要什么来执行? EVM EVM是一个计算引擎,有助于智能合约的部署和操作。 区块链上的智能合约和去中心化应用(Dapp)对外界数据拥有交互需求。 预言机的原理 数据获取过程:预言机的数据获取过程通常包括以下步骤: 智能合约发起数据请求:智能合约向预言机发送数据请求,指定需要获取的数据类型和参数。
文章前言 智能合约是一个运行在安全环境下的计算机程序,它可以直接控制数字资产,本篇文章我们主要介绍如何在公链环境中编译、部署、运行合约~ 合约部署 合约创建 以太坊支持使用solidity编写的智能合约 ,用户可以使用Solidity编写一个自己所需要的之智能合约,例如: pragma solidity ^0.8.4; contract test{ function multiply(uint a) public returns(uint d){ return a *7; } } 合约编译 关于合约的编译我们可以使用solc也可以使用在线编译工具Remix来对合约进行编译操作 之后验证合约部署成功与否: eth.getCode(test.address) ? 合约调用 之后调用test合约的multiply方法: test.multiply.call(8) ? 至此,合约在链上的部署流程演示完毕~ 文末小结 本篇文章只是对如何在公链环境中部署智能合约做了一个简单的介绍,而我们知道智能合约是运行在EVM上的,后续我们将对以太坊虚拟机源码进行分析,这里暂且不对此展开分析
以下是一个的智能合约区块链代码的案例分析和代码: 案例分析: 假设要创建一个简单的投票智能合约,包括创建选项、投票和查询投票结果等功能。 options.length; i++) { emit VotingResult(options[i].name, options[i].voteCount); } } } 这个智能合约实现了完整的投票功能 合约中包含了一个名为Option的结构体,用于表示选项的名称和投票数。options数组用于存储投票选项,voters映射用于记录哪些地址已经投票。 合约包含了三个关键函数: createOption:用于创建一个新的投票选项,会触发OptionCreated事件; vote:用于进行投票,会增加相应选项的投票数,并且记录投票者,每个地址只能投一次票 这个智能合约可以部署在以太坊或其他兼容的区块链网络上,在部署后,可以通过调用合约的函数来创建选项、进行投票和查询结果。
用户的应用直接和智能合约打交道,智能合约直接和Fabric账本进行交互。 一个完整的Fabric区块链应用包含两部分,一部分是用户的应用程序,一部分是用户编写的智能合约。 下图展示了用户智能合约和用户的应用程序以及账本交互的过程。用户的应用程序通过区块链网络的Peer节点,调用智能合约。用户智能合约通过区块链网络的Peer节点操作账本数据。 智能合约安装在区块链网络中的Peer节点上,运行时Peer节点会启动单独的docker容器来运行智能合约。 智能合约以容器启动后,会与启动智能合约容器的Peer节点建立交互,从而实现对对应Peer节点上账本相关数据的操作。 不同智能合约的命名空间不一样,互相之间的数据是独立的,一般情况下智能合约只能访问到属于自己命名空间的键值对。如果一个智能合约想访问另外智能合约的数据,可以通过在智能合约内部调用其他智能合约来实现。