自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 go -- 变量与常量

什么是变量变量(Variable)如名称所言变量指可以改变的量,其功能是存储数据。变量的出现是为了改变通过内存地址去查询在程序运行过程中的保存的数据。利用变量将数据的内存地址保存起来,往后就能通过这个变量找到内存上对应的数据,提高代码的可读性。变量类型Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用。其类型有整型、浮点型、布尔型等。声明变量Go语言中的变量需要声明后才能使用,同一作用域内不支持重复声明。 并且Go语言在函数中声明的变量在声明后必须使用。声明格式:va

2021-07-30 17:34:46 186

原创 初识 go语言--helloworld

输出 hello world代码package main // 声明 main 包,表明当前是一个可执行程序import "fmt" // 导入内置 fmt 包func main(){ // main函数,是程序执行的入口 fmt.Println("Hello World!") // 在终端打印 Hello World!}cmd 执行命令1.go build2.hello.exe或者1.go run main.go局部知识package 关键字 声明引用哪个包mai

2021-07-30 16:45:58 225

原创 智能合约语法详谈——this.|view 函数 pure 函数|fallback函数

使用 this. 即为外部访问contract C { uint public data; function X() public { data = 3;//内部访问 uint val = this.data();//外部访问 } }对于所有 public 状态变量 solidity编译器自动为状态变量生成对应的 getter(访问器)特性内部访问 getter 即为状态变量,外部访问即为 一个函数...

2021-05-28 11:11:35 3286 1

原创 链中自有黄金屋--NFT浅析

链中自有黄金屋–NFT浅析前言​ 2021年3月11日,佳士得历史上首次拍卖以 NFT 形式展现的纯数字艺术品,这幅底价100美元的作品最终以6934.6万美元成交,一举成为在世艺术家成交作品第三高价。​ 这一事件,将越来越多的目光吸引向 NFT 的世界。对于区块链行业外的人士而言,NFT 还是一个新鲜事物。但实际上,NFT 很早就已经出现了——即 在2017 年末以太坊上兴起的谜恋猫游戏。“谜恋猫是世界首款区块链游戏。“区块链”是支持类似比特币这样的加密货币的运作技术基础。尽管谜

2021-05-28 11:06:21 4458

原创 智能合约漏洞——int 溢出校验

function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; }大家注意了对于 int 类型的整数溢出不能用这个safemath去校验,目前主流的方法是判断结果是否大于0 ,小于0 证明回绕溢出了var x int8 = 120 var y int8 = 8 var z = x + y println(z) /...

2021-05-28 10:49:44 203

原创 智能合约漏洞——to.origin 判定

还记得全局函数 tx.origin 和 msg.sender 的区别吗?tx.origin 表示的是触发当前函数执行的原始的交易发送者,msg.sender 表示的是调用当前函数的直接消息发送者,在智能合约函数调用其他智能合约函数时,这两个发送者是不同的。漏洞合约示例:// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; // 不要使用这个合约,其中包含一个 bug。 contract TxUserWall

2021-05-28 10:36:45 963

原创 智能合约漏洞——浮点和数据精度

solidity语言中没有浮点类型。所以我们在处理数值类型时应该注意,solidity中只有整数除法,而整数除法会损失精度!小于除数的精度都会被舍弃!所以处理以太币的时候应该使用其最小单位wei。同样在ERC20智能合约中指定了decimals的情况下,同样使用其最小单位来处理具体的数值。示例:第6行使用msg.sulve先除以1e18,这会导致小于1ether的所有精度都被舍弃。后面sellTokens的处理也是错误的。在智能合约中一定要使用最小单位来处理数据。应该使用wei来记录余额。.

2021-05-28 10:35:04 2377 1

原创 智能合约漏洞——未初始化的存储指针

在solidity语言中,像动态的数组、struct、mapping这样的复杂数据结构是不能直接在"栈"里面保存的,因为"栈"里只能保存单独的"字",也就是只能保存实际数据长度小于等于32字节的简单数据类型。所以在solidity智能合约函数中声明动态数组和struct时,必须明确指明其位置在storage还是memory中。在函数内部,mapping类型则不能作为临时变量使用,只能作为某个状态变量的"储存指针",也就是mapping类型必须在编译时进行预先初始化,而不能作为运动时产生的数据。如果智能合约函

2021-05-28 10:33:25 731

原创 智能合约漏洞——时间戳操纵

另一种矿工作恶。合约逻辑如果某人在区块时间戳正好能被10整除的那个区块中第一个向智能合约转10 ether,那么它将获得之前转入合约的所有赌注。区块是矿工生成的,矿工可以预先知道下一个区块的时间戳是否能被15整除。...

2021-05-28 10:31:40 4666

原创 智能合约漏洞——拒绝服务

拒绝服务攻击,也就是DOS(Denial of Service)攻击,(1) 智能合约中基于一个可以被外部调用来控制的数据来执行循环,比如contract DistributeTokens { address public owner; address[] investors;// 投资人数组 uint[] investorTokens;// 每个投资人持有的token数 // 其他函数功能 包括transfertoken function invest() public payable { inv

2021-05-28 10:27:35 1956

原创 智能合约漏洞——未检查返回值

在solidity中,某些低级函数/全局函数会产生返回值作为执行结果,而不是像我们直接使用智能合约类型的变量进行函数调用那样,在调用的函数执行失败时会使当前执行直接失败;对于这些低级函数,如果没有对其返回值进行判断,则很容易出现逻辑错误。需要注意的低级函数有:send、call、callcode、delegatecall和staticcal比如在下列中:在第九行使用转账函数send,但是没有判断其返回值,这样即使send函数转账失败,第10行的状态修改依然会执行,这显然是错误的。...

2021-05-28 10:24:50 812

原创 智能合约漏洞——竞争条件/预先交易

这个攻击主要出于矿工作恶。contract FindThisHash { bytes32 constant public hash = 0x0000 0000 0000 0000 0000 0000 dede dede dede dede dede dede dede dede dede dede; constructor() public payable {}// 允许接受转账的构造函数 function solve(string solution) public { // 如果用户能找到给定哈希值的

2021-05-28 10:23:02 363

原创 智能合约漏洞——短地址攻击

基础知识严格意义来说,短地址/参数攻击并不算智能合约的漏洞,这是一个应用上的接口数据处理问题。在介绍过得ERC20模板智能合约,其中有个transfer函数,其定义如下;function transfer(address _to, uint256 _value) returns (bool success)实际进行调用的时候,客户端(DApp)需要发起一个交易,交易中附带对于这个智能合约函数的调用,也就是交易的data字段,它是一个字节数组。其中前4个字节是函数选择器,其后应该是这两个参数的A.

2021-05-27 11:09:25 2441 2

原创 智能合约漏洞——外部合约引用

​在智能合约中保留其他智能合约实例的引用,也就是声明一个其他智能合约类型的变量。合约示例:import "SomeEncrypyion.sol";​contract EncrypyionContract { //库智能合约的引用 SomeEncrypyion encrypyionLibrary; //初始化库智能合约引用的构造函数 constructor (SomeEncrypyion _encrypyionLibrary) { encrypyionL

2021-05-27 11:04:51 1053

原创 智能合约漏洞——随机错觉

​以太坊不存在"不确定"因数。从协议上说,所有的状态变动都是通过确定的算法(即所谓"状态转换函数")计算出来的。比如:各种哈希值。区块的难度值,甚至是工作量证明算法Eehhash的出的nonce和时间戳。以太坊产生随机数的方式,主要借助“预言机(Oracle)”服务来达成。 链外服务在链上会有一个用于注册服务请求的智能合约,我们称之为智能合约S; 当某个智能合约A希望获取随机数,它可以向智能合约S的特定函数F发起一个消息调用,F的参数会规定一些必要的输入,比如请求服务的类型,要求的返回格

2021-05-27 11:03:53 209

原创 智能合约漏洞——delegatecall漏洞

delegatecall与call操作产生的普通智能合约函数调用的最大区别就在于"执行环境不会切换":也就是账户状态、储存状态都保留当前的调用者智能合约对应的状态,并且msg.sender和msg.value也不会改变;仅仅是把目标地址上的代码,拿到智能合约的当前执行环境中来执行。但是如果是调用的"有状态"的库智能合约是会影响当前智能合约的状态。FibonacciLib合约示例:contract FibonacciLib{ //数列开始的数字 uint public start;

2021-05-27 11:02:43 5481 1

转载 智能合约漏洞——uint 算术溢出

​算术溢出:指对应无符号整数类型的变量,如果某个算术计算结果超出其所能表达的数值范围,就会发生上溢和下溢的现象。示例上溢(uint8 A1, uint A2) = (255, 255);A1 = A1 + 1;A2 = A2 + 128;得到结果为A1将为0,A2将为127。A1计算过程1111 1111 + 0000 0001 = 1 0000 0000,因为uint8 只保留8位进制,“1” 就被舍弃,结果为0000 0000,即0.A2计算过程1111 1111 + 1000 0

2021-05-27 11:01:09 790

转载 智能合约漏洞——重入漏洞

​前提:一个消息调用的目标,可以再次进行智能合约创建或者信息调用。重入:消息调用的目标智能合约函数中又调用了发起消息调用的智能合约的函数。假设:智能合约A有函数F1,攻击合约B有函数F2。F1功能是向消息发送方转账,或者调用消息发送方的特定函数,B就有可能利用重入进行攻击。受害者合约:contract EtherStore{ uint256 public withdrawaLimit = 1 ether; mapping(address => uint256) publi

2021-05-27 10:59:31 1253

转载 ERC20标准

今天我来认识ERC20标准。 以太坊是一个分布式的智能合约平台,可以分发代币(Token)。目前以太坊上有超过2万个代币的智能合约,我们可以在以太坊区块链浏览器中查看:https://www.etherscan.io 如果这么多代币的标准不统一,对于其他人来查看代码是相当痛苦的,众筹的人也就没有办法来检查代币分发的是否合理,也没有办法做到多种钱包的兼容。 所以才推出了一种以太坊代币的标准:ERC20标准。ERC20标准涵盖了哪些内容? 我...

2021-05-27 10:56:47 763

转载 solidity 基础智能合约

​ 今天来认识智能合约中常用的基础合约。地址工具用于检测某个地址是否为合约的工具pragma solidity ^0.4.24library AddressUtils{ function isContract(address addr) internal view returns(bool){ uint256 size; assembly{size:=extcodesize(addr)}//assembly 指明后面程序为内联汇编。extcodesiz..

2021-05-27 10:53:05 2073

转载 solidity语法(二)

继续学习solidity语法。​2.1函数类型以下是在Solidity中声明函数的方式。function sampleFunc(string name, uint amount) {}上面声明的是一个空体函数,它有两个参数:一个字符串和一个 uint。可以这样调用此函数:sampleFunc("Shashank", 10000);谈到函数,Solidity还提供函数修饰符。2.2函数四种访问权限函数声明有public、private、inter...

2021-05-27 10:48:58 838

转载 solidity语法学习

本篇将介绍solidity的基础语法1.1版本杂注在使用solidity编写合约时,应该使用版本杂注声明使用的编译器版本,这是为了避免该合约在未来被引入不兼容变更的编译器所编译。版本号形式 “0.x.0” “x.0.0”;使用语法:pragma solidity ^0.4.01.2 import用法导入其他源文件在全局级别,可以使用以下形式的import语句:import "filename";上述语句将所有全局符号从filename导入当前全局范围。import * as sym

2021-05-27 10:42:39 964

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除