`
文章列表

公链_Solana

共识:PoS 1.Solana生态系统中有多个角色(领导者、验证者、存档者等)。与DPoS区块链不同,Solana不会在网络参与者之间委派这些角色,而是由Solana节点履行网络的所有角色。 2.网络中都有且仅有一个Leader。每个验证者节点都具有与Leader节点相同的硬件能力,并且能够通过基于PoS算法的选举来成为Leader. 3.每个验证节点使用同一种算法来选择预期的领导者。当验证节点收到一个新的签名账本条目时,可以肯定某条目是来自预期的领导者。分配给每位领导者的插槽顺序称为leader schedule(领导者安排表),Solana以固定的时间间隔(称为插槽)轮换领导者。 4. ...

公链_Avalanche

Avalanche:设计了一款基于随机抽样和亚稳态决策的新型共识机制,该共识兼顾了依赖通信传输的经典拜占庭共识协议和依赖工作量证明创造链式结构的中本聪共识协议的优势,同时解决了经典拜占庭共识协议扩展性弱和中本聪共识 ...

公链_Fantom

Fantom:总部位于韩国,基于 DAG(有向无环图)改进版本的的高级 aBFT (异步拜占庭容错)共识机制 Lachesis 驱动,最初用来解决区块链三角困境。 1.每一笔交易信息都可以生成单独的单元,单元和单元之间只需要进行相互任意连接验证,不用像一般区块链要把交易合并打包出块才算是完成交易,因而提高了交易并发量,实现了即时交易. 2.由于Fantom能够兼容以太坊EVM虚拟机,以太坊的DeFi应用可以一键平移到该公链上,享受该公链的低费率和高速交易。 3.Fantom通过桥接将各种链纳入其网络,例如以太坊、BSC、Polygon和Avalanche,以顺应未来的多链趋势。 4.Fantom ...

gas优化

gas优化 1.短路运算会比多层if判定更消耗gas 2.使用成员变量会比硬编码更消耗gas 3.直接加减法运算会比使用汇编会更消耗gas 4.require失败打印较长的字符串会比较短的字符串更消耗gas 5.直接函数调用会比call更消耗gas 6.直接参数列表比压缩的方式更消耗gas,默认都是32字节,实际不需要

移位运算

pragma solidity >=0.4.0 <0.9.0; import "hardhat/console.sol"; contract Move { fallback() external { console.log("fallback"); bytes memory _bytes = msg.data; //0x00000008000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d5600 ...
设置一个非常大的位图,对数据做多种hash,如果每种hash的结果在位图上都是1则表示存在 事件查询 以太坊的bloom过滤器大大的提高了查询的效率。以太坊先创建topics的bloom,再创建logs的bloom,再创建收据的bloom,在创建header的bloom,最后创建block的bloom,一步一步构建上去。于此对应的,在查找日志的过程正好相反,即先根据查询条件得到布隆过滤器,先在block的bloom里面找,如果其位向量是区块布隆过滤器的子向量,则认为可能在此区块有,再在header的bloom里面找,再在收据的bloom里面找,直到找到最终的日志。

eth_fetch

fetch的流程 1.当我们接收到NewBlockHashesMsg消息得时候,我们只收到了很多Block的hash值。 需要通过hash值来同步区块,然后更新本地区块链。 fetcher就提供了这样的功能 2.fetcher通过四个map(announced,fetching,fetched,completing )记录了announce的状态(等待fetch,正在fetch,fetch完头等待fetch body, fetch完成),并通过定时器和各种消息来对各种map里面的announce进行状态转换,announced --fetchTimer(fetch header)---> ...
常见漏洞 1.在做运算时有可能导致uint256溢出,验证的时候可以通过,实际会导致账户增加大量token,所以最好在运算时使用safemath库 2.重入攻击,利用转账会触发fallback,再次"提现",而提现函数中先触发转账,没有及时更新数据库导致被重入,一般使用标致位或先修改数据库 3.访问权限控制,要注意各修饰符中的逻辑正确性,避免bug导致权限校验失败 4.尽量避免跨合约调用,有一些经常被调用的函数要设置成合约不可调用,如限制msg.sender和tx.origin为同一个地址 5.在使用随机数的时候尽量避免随机数的直接获利,如果一定要使用随机数"开大奖 ...
RLPx使用了(Perfect Forward Secrecy):链接的两方生成生成随机的私钥,通过随机的私钥得到公钥。 然后双方交换各自的公钥, 这样双方都可以通过自己随机的私钥和对方的公钥来生成一个同样的共享密钥(shared-secret)。 后续的通讯使用这个共享密钥作为对称加密算法的密钥。 这样来说。如果有一天一方的私钥被泄露,也只会影响泄露之后的消息的安全性, 对于之前的通讯是安全的(因为通讯的密钥是随机生成的,用完后就消失了)。

合约审计工具

slither https://github.com/eth-sri/securify2

内存布局

Solidity保留了四个32字节的插槽,字节范围(包括端点)特定用途如下: 0x00 - 0x3f (64 字节): 用于哈希方法的暂存空间(临时空间) 0x40 - 0x5f (32 字节): 当前分配的内存大小(也作为空闲内存指针) 0x60 - 0x7f (32 字节): 零位插槽,用作动态内存数组的初始值,并且永远不应写入(空闲内存指针最初指向``0x80``). Solidity 总是将新对象放在空闲内存指针上,并且内存永远不会被释放(将来可能会改变)。 Solidity 中的内存数组中的元素始终占据32字节的倍数(对于 byte[] 总是这样,但对于 bytes 和 stri ...

数据存储

内存对齐 静态大小的变量(除 映射mapping 和动态数组之外的所有类型)都从位置0开始连续放置在存储storage 中。如果可能的话,存储大小少于32字节的多个变量会被打包到一个 存储插槽storage slot 中,规则如下: 1.存储插槽storage slot 的第一项会以低位对齐(即右对齐)的方式储存。 2.基本类型仅使用存储它们所需的字节。 3.如果存储插槽storage slot 中的剩余空间不足以储存一个基本类型,那么它会被移入下一个 存储插槽storage slot 。 结构体(struct)和数组数据总是会占用一整个新插槽(但结构体或数组中的各项,都会以这些规则进行打包)。 ...

event

anonymous: for events Does not store event signature as topic. indexed: for event parameters Stores the parameter as topic. // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; contract Event { event e1(int256); event e2( ...

assembly let

let:在汇编代码块中定义的变量,在该代码块 外部是无法访问的 1.创建一个新的堆栈槽位 2.为变量保留该槽位 3.当到达代码块结束时自动销毁该槽位 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.6.0 <0.9.0; import "hardhat/console.sol"; contract Assembly1 { constructor(){ } function fun() public { uint256 a = ...

MPT树

每一个以太坊的区块头包含三颗MPT树,分别是 交易树 收据树(交易执行过程中的一些数据) 状态树(账号信息, 合约账户和用户账户) 从编码来说,有三种编码: Raw编码:原生的key编码,是MPT对外提供接口中使用的编码方式,当数据项被插入到树中时,Raw编码被转换成Hex编码; Hex编码:16进制扩展编码,用于对内存中树节点key进行编码,当树节点被持久化到数据库时,Hex编码被转换成HP编码; HP编码:16进制前缀编码,用于对数据库中树节点key进行编码,当树节点被加载到内存时,HP编码被转换成Hex编码; Trie树的插入,这是一个递归调用的方法,从根节点开始,一直往下找,直到 ...
Global site tag (gtag.js) - Google Analytics