Web3
2024-09-19 20:35:44 0 举报
AI智能生成
Blockchain
作者其他创作
大纲/内容
区块链概念
什么是区块链?
区块链是由不断增长的区块串联而成,每个区块包含一段时间内发生的事务及数据,通过哈希密码学加密数据并链接着上一个区块的哈希值,形成了不可篡改的链条
区块链的优势?
去中心化
不依赖中央机构,数据存在多个节点,抗攻击能力更健壮
离散性
多个节点存储且数据一致
安全性
数据不可篡改,各个节点相互信任
区块链如何保证数据的一致性?
每个节点包含完整的数据副本,通过共识机制保持和其他节点的同步
如何衡量业务场景是否适合使用区块链?
参与者
是否有多个参与者?
YES
是否需要避开中央机构?
YES
性能
业务吞吐量是否比较低?
YES
业务逻辑
业务逻辑是否简单?
YES
业务逻辑是否需要频繁变更?
NO
安全
参与者之间是否相互信任
YES
事务处理顺序是否重要
NO
交易延迟可能影响处理顺序
事务是否需要私密性
NO
如何解释工作量证明PoW和权益证明PoS
工作量证明
节点通过解决复杂的数据问题获得记账权
需要消耗大量的计算资源
权益证明
节点通过质押的货币数量和质押时间获得记账权
区块链有哪几种类型?
公链Public Blockchain
任何人都可以验证和记录交易
如比特币、以太坊
私链Private Blockchain
参与验证和记录交易的节点是私有的
如企业内部链
联盟链Consortium Blockchain
多个机构共同维护的区块链,授权的节点参与和记录交易
适合跨机构的业务场景,如供应链管理
三者的核心区别
访问开放程度
去中心化程度
区块链技术如何确保数据安全?
加密算法和共识机制确保节点安全的存储、验证和同步数据
51%原则,任何未授权的数据修改需要得到51%的节点认可,确保数据安全性
以太坊基础知识
什么是以太坊?
以太坊是一个公共区块链网络
通过内置的以太坊虚拟机执行用户编写的智能合约
原生货币是ETH,用于交易和网络服务的支付方式
以太坊使用的共识机制是什么?
一开始使用工作量机制PoW
22年9月之后转而使用PoS
为什么从PoW转向PoS?
降低能源消耗
降低参与门槛
什么是gas?
gas是执行操作和智能合约所需计算量的度量单位
每一项的操作和交易都需要消耗gas,以支付网络中的计算
以太坊的gas使用ETH支付,是以太坊安全和抗攻击的关键机制
区块链浏览器是什么?有哪些用途?
一个在线工具,用来查看区块链上的所有交易和区块详情
增加区块链网络的透明性和可追踪性
如EtherScan、Ethplorer
以太坊主网、测试网和侧链有什么不同?
主网是实际运行真实资产的区块链
测试网是用来开发测试的区块链,使用无实际价值的ETH
侧链是独立于主网的区块链,可以支持额外的应用和提供更低的交易费用,通常与主网互通
Metamask的用途
发送和接收代币
与智能合约交互
允许用户创建和管理账户
可以连接去中心化应用
什么是去中心化应用Dapps
Dapps是运行在区块链网络上的应用,利用智能合约在区块链上自动运行和管理数据
加密钱包概念
什么是非托管型钱包?
用户对钱包资产拥有完全的控制权,助记词和私钥,如Metamask
冷钱包和热钱包的区别?
冷钱包是完全不触网的钱包,安全性更高但不方便
热钱包是触网的钱包,使用方便但会受到网络攻击
如何处理加密钱包中的安全风险?
使用复杂且单一的密码
离线备份助记词/秘钥
保持软件更新
避免使用公共网络
解释下钱包地址、公钥和私钥。以及它们之间的关系?
私钥是一串私密字符,赋予持有者对钱包资产的完全控制权,用于签署交易、身份验证,是生成公钥的基础
公钥是由私钥通过椭圆曲线加密算法生成,可以验证交易签名的有效性
钱包地址是由公钥通过一次或多次哈希运算生成,是钱包的公开标识
区块链网络的使用
什么是跨链桥?说明其工作原理
跨链桥技术,允许在不同区块链网络之间转移代币
工作原理:在源链上锁定资产,在另一条链上发送对应的代币
场景:BTC转移到以太坊进行DeFi操作、跨链调用智能合约功能、多链资产管理
什么是RPC服务器,它在区块链上的作用?
RPC服务是一种通信协议,允许程序通过网络向远程服务器发送操作请求
在区块链中,是客户端(如钱包、Dapps、开发者工具)与节点交互的通信桥梁
什么是智能合约?它在区块链网络的应用?
智能合约是运行在区块链上自动执行、控制和记录的计算机程序
在区块链上的应用
去中心化金融DeFi
去中心化自治组织DAO
非同质化代币NFT
供应链管理、保险、版权管理
描述ERC20代币标准的主要特点
ERC20是一种在以太坊网络发行可交换代币的标准
定义了一套规则,如代币的发行及转账、余额的查询等
解释下基础代币和合约代币的区别
基础代币是区块链上的原生代币,如BTC、ETH,主要用于支付交易费用
合约代币是通过智能合约发行的代币,如ERC20代币,可以在区块链上实现更复杂的功能
如何确保区块链网络的数据完整性?
加密技术
哈希函数和数字签名防止数据被篡改
分布式账本
保证部分节点被攻击也不会影响网络的数据完整
共识机制
确保只有合法的交易才被记录
经济激励和惩罚机制
使得每个节点都会尽力维护网络的数据完整性
区块链应用开发中常见的性能瓶颈有哪些?如何优化?
交易吞吐量
每秒只能处理少量交易,从而导致网络拥堵
优化方式
L2技术,将部分交易移至链下处理,仅在必要时回归主链结算
分片技术,通过将区块链分为多个分片,每个分片独立处理部分交易,提升整体吞吐量
侧链,利用独立于主链的侧链处理大量交易,定期接结果同步回主链
交易确认时间长
优化方式
选择更快的共识机制PoS(权益证明)、DPoS(委托权益证明)、PBFT(实用拜占庭容错)
智能合约执行效率
优化方式
代码优化,减少不必要的计算
虚拟机优化,使用更高效的指令集
网络延迟
优化方式
节点优化,选择延迟低的节点部署应用
节点间部署CDN(内容分发网络)
在区块链项目中,如何处理升级和数据迁移?
智能合约的可升级设计,使用代理合约分离逻辑和数据
数据迁移
数据结构升级了,如新增字段或修改数据类型,可以在新的逻辑合约中定义新的数据结构,同时保持与旧结构兼容。
通过一次性迁移函数或逐步迁移的方式将旧数据迁移到新结构
通过一次性迁移函数或逐步迁移的方式将旧数据迁移到新结构
状态迁移。如果是数据量较小,可以选择一次性迁移所有数据,或者使用惰性迁移(Lazy Migration)策略,当用户首次与新合约交互时,才将相关数据迁移过来
治理机制
使用多签钱包管理迁移过程,任何升级和迁移都需要多方签名确认。减少风险。
版本控制和回滚机制
保留不同版本的合约代码和部署信息,以便在需要时进行回滚
测试和验证
升级和迁移前,务必在测试网上进行全面的测试
文档和通知
详细记录每次升级和迁移的详情,以便后续审计。升级和迁移时提前通知用户,确保用户有充足的时间进行必要的操作
加密技术
什么是对称加密?
加密解密使用相同的密钥。如RC4、AES
AES算法密钥长度有哪些选择?
128位、192位、256位
为什么DES是不安全的?
早期的分组密码算法
长度56位容易被破解
分组密码在区块链技术中的应用有哪些?
数字钱包的私钥管理
区块链网络层的通信安全
非对称加密算法与对称加密比较有哪些优点?
加密解密使用不同的密钥,提供更高的安全性
特别在数字签名和安全通信领域
RSA算法的安全性是基于什么数学问题?
大质数分解
数据签名技术的工作原理?
通过私钥进行签名,通过公钥验证签名的有效性。确保数据的完整性和来源的可靠性。
在区块链中,如何使用非对称加密进行数据加密传输?
通过公钥加密信息,通过私钥解密获得信息,确保只有密钥拥有者才能获得信息。
什么是零知识证明?
一种加密协议,允许证明者向验证者证明拥有某个信息而不需要提供信息本身。
在区块链中,Merkle是如何提高数据完整性验证效率的?
默克尔树构建了从根节点到叶节点的哈希链,使得只需要验证数据的部分分支而不需要验证整个结构数据集
Base58编码与Base64有何不同?为何Base58更适合区块链地址编码?
Base58去除了易混淆的字符,如数字0和大写字母O等,更易于阅读和手工输入。
区块链地址和私钥需要可读性更高,所以Base58更适合。
共识机制
区块链有哪些共识机制?
工作量证明
权益证明
委托权益证明
Casper共识
混合型PoS机制,引入了一定的惩罚机制
混合共识机制
CAP定理
一个分布式系统不可能同时满足强一致性、可用性和分区容忍性。设计者必须在三者之间做出选择和权衡。
FLP定理
在一个异步通信的分布式系统中,如果存在一个节点可能故障,那么系统不可能同时满足强一致性、可用性和分区容忍性。
拜占庭容错BFT共识算法
拜占庭将军问题:几个拜占庭将军围攻一座城堡,他们需要同一时间一起决定进攻才能成功,否则失败。将军们通过信使发送信息,但问题是:
1. 有些将军可能是叛徒,发送错误的信息破坏一致性行动
2. 只要有一个将军采取了不同的行动,则行动失败
拜占庭容错共识算法就是在即时部分节点出现故障或者恶意行为的情况下,仍能达到一致性的算法。
区块链网络的各个节点互相传递信息,进行反复确认,以达到对某一状态或交易的共识。
主要通过多数原则 + 多轮确认的机制,确保系统在部分恶意节点存在的情况下也能正常运行。
BTC原理
什么是最长链原则?
如果在网络中,存在多个有效的区块链分叉,会选择拥有最长链的分叉。
硬分叉和软分叉的区别?
硬分叉相当于创建一个新的区块链,节点必须升级才能继续跟踪区块链
软分叉向后兼容,所有节点都可以接收新区块
什么是coinbase交易?
区块的第一笔交易
没有输入,只有输出,记录着矿工的奖励和手续费
什么是UTXO模型?
比特币的账户余额机制,通过追踪未花费的交易输出,来确定用户可以花费的资金。
UTXO特点
不可分割,每个UTXO都是独立的实体,必须整体使用,不能部分花费
交易处理,当用户想要花费一笔资金时,需要消耗一个或多个UTXO,并生成新的UTXO作为输出
余额计算,一个用户的资金余额是通过汇总用户所有的UTXO来计算的。
工作机制
假如用户A拥有一个UTXO值为10个比特币,他想转5个比特币给用户B。首先会消耗掉原来的UTXO,然后生成两个新的UTXO,一个属于用户B,一个属于用户A
优势
并行处理,因为UTXO是独立的实体
安全性高,每笔交易都消耗之前的输出,使得双重支付变得更难
隐私性高,不直接依赖账户余额,用户可以通过生成新的地址来增强隐私
比特币如何解决双花问题?
节点验证所有交易是否引用了UTXO,而一旦UTXO被引用,就被标记被已花费,不能再次使用。
比特币地址是如何生成的?
通过将用户公钥哈希算法加密处理后,在用Base58编码形成一串字符
隔离见证是什么?如何工作的?
隔离见证是比特币的一次软分叉升级,解决了交易延展性并提高区块容量
什么是交易延展性?是指比特币交易的哈希(交易ID)可以被第三方在交易确认前进行非恶意的修改。
例如,第三方在检测交易时发现交易设置的gas过低导致交易未被矿工打包处理,第三方可以通过增加gas提高交易优先级
通过将签名数据与交易的其他部分分离,并将其移至一个单独的部分。使得交易ID的计算不在依赖签名数据
解决的交易延展性、提高了区块容量、降低交易的费用
比特币挖矿是如何进行的?
节点通过哈希加密运算,不断调整区块头的nonce值使得最终的哈希值满足当前网络的难度目标
计算成功的节点将获得区块奖励和交易手续费
比特币网络的难度调整是如何工作的?
根据过去2016个区块的解决速度进行调整,以确保网络每10分钟生成一个新的区块。
以太坊原理
以太坊交易的基本组成部分
发送方地址 From
接收方地址 To
交易金额 Value
附带的数据 Data
调用智能合约函数时传递的参数
交易序号 Nonce
防止重入攻击,并确保交易的顺序。每次交易发起时,发送方账户的Nonce会递增
验证身份的私钥签名 Signature
链标识 Chain ID
在不同的以太坊网络中区分交易,确保交易只在指定的网络上有效
燃料上限 GasLimit
限制交易执行所需的计算资源,防止无限循环或过多的消耗资源
燃料价格 GasPrice
决定矿工是否优先处理这笔交易
以太坊转账处理流程
1. 创建交易和签名
发送方发起一笔交易时,会指定接收方地址、交易金额、交易序号、链ID、GasLimit和GasPrice等,然后使用私钥进行签名,保证交易真实性不被篡改
2. 签名后的交易会被广播到以太坊网络,并传播给所有节点
3. 节点在接收到交易后,会对交易的真实有效性进行初步验证,例如签名验证、检查nonce、发送方余额是否足够支付gas费等
4. 然后交易会被打包进一个区块,矿工节点计算区块的哈希值,验证者验证通过后,广播到整个网络
5. 当区块被成功添加到区块链中时,EVM开始执行区块中的每一笔交易
5.1 首先检查nonce防止交易重放攻击
5.2 然后扣除发送方账户指定的gas上限费用,以防止交易失败矿工无法得到报酬
5.3 更新账户余额,扣除发送方的转账金额,增加到接收方的账户中
5.4 计算实际消耗的gas,将未使用的部分还给发送方
5.5 如果有的话,更新合约状态变化
6. 当EVM成功执行完所有交易后,整个区块状态被更新,并最终记录到区块链上
evm执行交易时,消耗的gas超出上限会发生什么?
1. 首先会立刻停止执行当前交易,并将所有状态回滚到交易前状态,账户余额、合约状态、存储的变化等
2. 即使交易被回滚了,当时已经消耗的gas费用仍需支付给矿工。
3. 交易失败的记录仍会包含在区块中并记录到区块链上,以保持链上的记录完整性
4. 如果交易过程中触发了任何事件和日志,这些事件和日志也会被回滚,也就是说任何事件监听器都不会捕捉到失败交易的事件
以太坊如何防止外部账户的重复支付问题?
通过检查nonce字段来防止重复支付。每个外部账户的nonce字段表示该账户发出的交易数量,通过此机制保证每笔交易都是独一无二的。
以太坊区块结构包括哪些部分?
1. 区块头 Block Header
区块头包含区块的元数据和一些重要的加密信息
1.1 父区块哈希 Parent Hash
前一个区块的哈希值,确保区块间的顺序和连续性
1.2 区块哈希 Block Hash
当前区块的唯一标识,对区块头内容哈希加密算法生成,确保区块的完整和有效性
1.3 默克尔树根 State Root
当前区块状态的根哈希值,表示区块链所有账户及状态(如余额、合约状态等)的加密摘要,确保链上数据的完整性和一致性
1.4 交易根 Transaction Root
当前区块所有交易的默克尔树根哈希,可以快速验证区块内的所有交易完整性
1.5 收据根 Receipts Root
当前区块所有交易收据的默克尔树根哈希
1.6 区块时间戳 Timestamp
记录区块创建的时间
1.7 难度 Difficulty
计算数学难题的难度级别,用于调节出块时间
1.8 Gas Limit/Gas Used
表示区块内所有交易可消耗的最大gas总量,以及实际消耗的gas总量
1.9 矿工地址 Coinbase or Miner Address
挖出区块的矿工地址,该地址获得区块奖励和交易费
1.10 随机数 Nonce
即数学难题的答案,与区块头其他字段结合使得哈希值满足目标难度
1.11 额外数据 Extra Data
可选字段,通常用于矿工添加一些自定义的数据,最多32字节
2. 区块体 Block Body
2.1 交易列表 Transaction List
包含区块中所有交易的有序列表,每笔交易包括发送者、接收者、金额、gas、nonce等详细信息
2.2 叔块列表 Ommer List
包含当前区块同一高度但未被主链接收的区块的信息
叔块列表的作用是什么?
叔块指的是与当前区块处于同一高度但未被主链接收的区块
为什么记录叔块呢?因为在以太坊网络中,出块速度较快(平均15秒一个),导致多个矿工可能几乎同时挖出一个区块。这种情况下,只能有一个区块被主链接收,如果其他区块被完全忽略的话,则其他矿工的努力就会白费。这样会导致只有地理位置更接近网络中心的节点优势更加明显,削弱网络的去中心化。通过给与挖出叔块的矿工部分奖励,鼓励更多矿工参与挖矿,以提高网络的去中心化和安全性。同时帮助减少链上分叉,提高网络稳定性。
额外记录叔块列表会减少区块的容量吗?
首先叔块的信息是以摘要的形式记录在区块中,每个叔块只包含哈希值、叔块矿工地址、叔块父哈希值等简化的元数据。因此其容量非常小,相较于它的作用这些占用的空间可以忽略不计。
以太坊数据层的主要功能是什么?
使用LevelDB作为基础的键值对存储系统,高效管理区块链数据
通过Merkle Patricia Tree(MPT) 数据结构,有效的组织和压缩数据,使得存储和检索效率更高,同时节点可以轻松的验证数据的正确性
MPT是什么样的数据结构?
MPT是一种混合的数据结构,结合了Merkle Tree和Patricia Trie。其中Merkle Tree是一种二叉树结构,快速计算数据哈希值,Patricia Trie是一种优化的字典树(Trie),用于存储键值对
Trie是什么结构?Patricia Tree是怎么优化的?
Trie前缀树/字典树是存储键值对的树形结构,每个节点代表键中的一个字符,路径从根节点到叶子节点形成一个完整的键,最终存储对应的值
普通的Trie节点只存一个字符,导致树深度较大。Patricia Trie通过压缩路径减少树深,多个没有分叉的节点合并为一个节点。
Merkle Tree的存储结构是什么样的?
叶子结点存储所有数据的哈希值
非叶子节点存储其两个子节点哈希值的哈希
根节点代表整个树的哈希值
以太坊有哪两种账户类型?
外部账户EOA,由用户创建管理,通过私钥签名发送交易
合约账户,通过部署智能合约创建,由合约部署者或指定的管理者管理,可以编写特定函数实现所有权的转移
以太坊交易的两大类型?
以太坊的交易分为消息通信和合约创建两大类。消息通信包括账户间的资金转移和合约函数调用,合约创建涉及将智能合约部署到网络中。
这些交易都是由外部账户发起,并通过以太坊网络传输,最终由矿工将其记录在区块链上。
以太坊是如何实现交易签名和验证的?
首先发起者构建交易,用私钥签名,并将签名和交易一起提交到以太坊网络中。节点收到交易之后,通过公钥验证交易的合法性。
另外,以太坊使用基于EIP-155的签名方案,通过在交易数据中添加链标识符,确保一个链上创建的交易不能在其他链上重放。
以太坊P2P网络中的Kademlia(Kad)协议的工作原理?
Kademlia协议是一种基于分布式哈希表(DHT)的协议,以太坊网络使用Kad协议来实现节点间的高效路由和数据存储。
我们先说下它是及如何实现节点的高效路由的
首先以太坊的节点都有一个唯一的节点标识符(Node ID),是通过对节点的公钥进行哈希计算生成
然后Kad协议对节点标识符使用异或运算来计算节点之间的距离
每个节点都维护多个K桶,K桶用来存储特定范围内的节点信息
当需要查找某个节点时,Kad从节点的K桶开始查询,如果没发现目标节点,再向K桶中的节点并行发送查找请求,直到找到目标节点。
接下来讲下它的数据存储
在以太坊网络中,数据通常以键值对形式存储。
那Kad协议将数据的键与节点标识符进行异或运算出异或距离,将数据存储到距离近的节点。数据一般都存储到距离近的多个节点上,增加冗余和可用性
数据检索过程呢就类似节点查找。首先节点会计算出目标数据键值与自己节点标识符的异或距离,然后在距离相近的K桶中选择与目标键值最近几个节点,向这些节点并行发送查找请求,直至找到存储该数据的节点。
节点的加入和离开
新节点加入网络时,会计算与其他节点的异或距离,填充K桶。同时其他节点也会更新各自的K桶
Kad协议会定期发送Ping给K桶的节点,检查他们的状态,一旦发现节点不响应了,K桶就会替换成其他活跃的节点
Solidity基础
uint、int
什么情况下使用uint或int?
unit是无符号整型,适合没有负数场景,如供应量
int是有符号整型,用于有负数的场景,如复杂的金融逻辑可能存在资产负债
string、bytes
什么时候使用string或bytes
需要存储或处理人类可读的文本信息时,使用string
需要进行字节级操作或处理原始数据时使用bytes,如哈希值、签名、加密数据等。bytes比string更高效应为它不涉及UTF-8编码处理
mapping、array
频繁变动的数据适合使用mapping,静态数据或需要顺序访问的数据适合使用array
一般情况下,mapping更高效些
如何实现一个可迭代的mapping
引入辅助数组记录key的顺序,引入mapping(key->bool)记录key是否存在
view、pure
view函数表示该函数只读取区块链的状态变量,不做任何修改,不消耗gas
pure函数表示该函数完全独立于区块链状态,只执行纯计算逻辑,不消耗gas
pure的其他特性
pure函数表明该函数完全独立于区块链状态,在合约设计中可以讲逻辑计算和状态操作明确分离
对于开发者来说,明确的pure关键字可以避免编写代码时无意访问或依赖状态变量,减少错误的发生。
对于编译器来说,pure的函数不依赖区块链状态,编译器会对其进行更激进的优化,例如将pure函数的计算结果缓存或内联到调用代码中,从而提高执行效率
send、transfer和call发送代币的区别?推荐使用哪个?
send返回一个boolean值表示转账是否成功,因此失败时不抛出异常,需要显示的检查返回值。gas限制2300
transfer失败会抛出异常,更安全。gas限制2300。推荐使用
call是低级函数调用,更灵活,返回一个boolean和data,失败时不抛出异常,无gas限制
call和delegatecall的区别是什么?
call和delegatecall都是与外部合约交互的低级函数,他们的主要区别是执行上下文。
call是在目标合约的上下文执行代码,修改目标合约的状态,调用者合约不会修改状态。
delegatecall是在调用者合约的上下文执行代码,修改调用者合约的状态,目标合约状态不会改变。通常用于合约的代理模式
如果调用delegatecall的代理合约和目标合约的状态变量不一致,即存储布局不一致会发生什么?
可能会导致不可预知的错误。因为solidity的状态变量在合约的存储是通过存储槽进行定位的。
当调用delegatecall时,改变的状态变量如果不存在代理合约中,可能会改变相同存储槽位置的其他变量。
fallback和receive函数的区别和作用
fallback和receive都是payable的函数,可以接收以太币。
当向合约发送以太币时,检查msg.data是否为空
如果msg.data为空,会检查receive函数是否存在,存在的话执行receive,不存在的话执行fallback
如果msg.data不为空,会尝试调用msg.data的函数,如果没找到指定函数则执行fallback
staticcall是干什么的?
staticcall用于调用其他合约的只读函数。
为什么需要使用staticcall
可以确保调用时不改变目标合约的状态
try/catch
try/catch只使用于外部合约调用或合约创建(new)
try externalContract.call() returns (uint result) {
} catch Error(string memory reason) {
} catch (bytes memory lowLevelData) {
}
} catch Error(string memory reason) {
} catch (bytes memory lowLevelData) {
}
数字签名的过程
1. 打包签名的消息,并进行哈希处理msgHash
keccak256(abi.encodePacked(a,b,c,d))
2. 对magHash进行以太坊签名哈希处理
加上前缀\x19Ethereum Signed Message:\n32,然后执行keccak256(abi.encodePacked(a,b));
3. 使用私钥对哈希值进行签名(链下操作)
ethereum.request({method:"personal_sign", param:[account,hash]})
验证签名的过程
1. 根据原始消息计算哈希值msgHash
2. 从签名中提取v, r, s
3. 调用ecrecover,传入msgHash和vrs恢复地址,与签署者地址比较是否一致
ABI
为什么需要ABI才能和智能合约交互?
ABI是一种接口规范,可以让外部知道如何格式化调用,如何正确的与合约函数交互
在ABI中,动态类型和静态类型有什么区别?
静态类型的大小和位置在编码前是已知的,动态类型的大小和位置在编码前不确定,需要在编码后的数据单独指定。
函数选择器在ABI中的用途及工作原理?
函数选择器在ABI中主要用来识别和调用指定的函数,确保外部调用可以精确定位到智能合约的函数。
工作机制
1. 首先函数选择器是从函数签名中生成的。函数签名就是函数名加上参数类型列表,通过keccak256哈希运算生成的哈希值,函数选择器就是函数签名的前4个字节,即8个十六进制字符。
2. 当外部调用智能合约函数时,调用的数据包含函数选择器和函数的参数,参数的编码值依次紧跟在函数选择器之后。evm根据这个函数选择器找到对应的函数并传递参数列表,从而完成函数的调用
潜在的问题
哈希碰撞,理论上存在不同的函数签名产生相同函数选择器的可能性,实际上非常罕见
而且如果发生冲突,solidity编译时会检测提示错误以避免这种情况
在solidity中,哪些类型不被ABI直接支持?
一些复杂的或者自定义的数据类型,如struct、enum、mapping、多维array等不被ABI直接支持。
事件的ABI编码如何存储索引和未索引的参数?
已索引的参数会和事件的keccak哈希一起作为日志项的topic存储
未索引的参数则存储在日志的数据部分
abi.encodePacked()和abi.encode()的区别?
encodePacked生成紧凑的字节数组,不会添加额外的填充或对齐信息。适合紧凑编码或拼接时使用,如哈希计算、字符串拼接
encode生成标准的ABI编码,包含填充和对齐信息。适合函数调用、参数传递和复杂数据结构的编码等
encodePacked有什么问题吗?
可能在某些情况产生哈希碰撞。如encodePacked("ab","c")和encodePacked("a","bc")会生成相同的结果
ABI是如何编码动态数组的?
首先对数组长度编码,然后对数组中每个元素编码,将数据长度的编码和各个元素编码合并在一起
如果新增元素之后,数组长度变化,重新编码,然后对新元素编码,将数据长度和各个元素编码合并在一起
abi的编码和解码的函数有哪些?
ab.encode
abi.encodePacked
子主题
abi.encodeWithSignature类似于encodeWithSelector,但直接使用函数签名而不是函数选择器
abi.encodeCall 是Solidity 0.8.11新特性,接收一个函数签名和参数,返回编码后的字节数据。
abi.encodeCall(this.transfer, address, uint256)
智能合约
什么是灰度策略?在智能合约系统中实施灰度策略有哪些考虑因素?
灰度策略是合约升级的一种策略,允许部分用户先体验新版本功能,同时旧版本继续服务其他用户,以实现平滑过度。
考虑因素
选择哪些用户体验新版本
考虑版本变更的影响范围
完善的回滚机制
与旧版本兼容,确保其他用户的服务
最后监控升级后的效果
在项目中如何确保与智能合约交互的安全性?
1. 使用已经审计过的库和工具,如openzeppelin、ethers.js
2. 对合约代码进行完整的测试和审计
3. 使用安全的节点连接
4. 合理的处理错误和异常
如何使用solc和ethabi
首先,solc编译器编译solidity代码生成abi文件,命令: solc <filename>.sol --abi -o <output>.abi
然后,ethabi将abi文件转成其他语言可用的格式
合约安全
智能合约常见的合约攻击方式和预防措施?
1. 重入攻击 Reentrancy Attack
攻击者通过递归调用函数,在合约状态被更改之前重复执行,如The DAO事件导致以太坊硬分叉
防范措施
1. 函数加锁防止递归调用
2. 代码遵循Check-Effect-Interaction模式,状态变更发生在外部调用之前
3. 使用transfer或send函数转账,2300gas的消耗限制避免外部合约执行复杂逻辑
2. 拒绝服务攻击 DoS Attack
攻击者通过操作使合约无法执行其功能。例如合约有个函数可以改变数组的大小,攻击者可以不断填充数组使数组的长度过大从而消耗掉最大gas,导致合约调用失败。
防范措施
1. 设置合理的权限控制,不要让用户随意操作合约的敏感数据
2. 将数组改成mapping结构,提高gas利用率,也避免了循环操作
3. 时间戳欺诈攻击
如果合约依赖区块时间戳进行操作,可能被矿工操控从而改变交易顺序或结果。如博彩,矿工在打包交易时,可以选择性的调整区块时间戳以确保中彩
防范措施
1. 避免使用时间戳来进行重要的决策或状态更新
2. 基于区块高度进行计算,以减少时间操控的风险
3. 一些随机数的生成使用去中心化预言机,如Chainlink VRF
4. 前端攻击 Front-Running
攻击者观察未确认的交易池(mempool),然后发送更高gas的交易来抢先执行,从中获利
例如,去中心化交易所的抢跑攻击者。用户在交易所提交了一笔交易,以较低的价格购买代币。交易提交后,攻击者观察到这边交易即将影响市场价格,就立即提交一笔与之类似的交易但设置更高的gas,使得矿工优先处理。原交易之后才被处理,但价格已经上涨了。
防范措施
1. 通过使用随机数或锁定机制来减少交易顺序的影响
2. 延迟揭示机制(Commit-Reveal),让用户先提交加密承诺,在稍后时间才揭示交易细节,防止攻击者提前窃取信息
3. 去中心化交易所设置合理的滑点限制交易价格的波动范围,防止价格被操控。
5. 回退函数攻击 Fallback Function Exploitation
如果合约的回退函数没有明确限制且进行了复杂的操作,攻击者可能通过反复发送极少量ETH交易来消耗合约的gas
防范措施
1. 限制回退函数的操作逻辑,确保其简单且消耗极少的gas
2. 使用receive和fallback函数明确区分转账和非预期调用
6. 权限控制
如果合约的敏感操作未被设置合理的权限控制,攻击者可能直接操控合约的行为
防范措施
敏感的函数设置合理的权限控制,如Ownable、AccessControl
交易所如何避免闪电贷攻击(Flash Loan Attack)?
攻击者利用DeFi协议的漏洞,通过在交易中借入和归还大量资产来操控市场价格
防范措施
1. 使用预言机:在价格计算时使用可靠的预言机服务,如Chainlink,获取外部市场准确的价格信息,有助于确保价格不受攻击者操纵
2. 使用时间加权平均价格,而不是即时价格,降低攻击者在单个交易操纵价格的能力
3. 限制单笔交易的规模:较少闪电贷攻击者的操控能力
4. 设置交易滑点:当交易价格与期望价格相差过大时,交易奖杯拒绝,减少用户受损
5. 设置系统监控和预警:检查异常交易和潜在的闪电贷攻击,一旦发现可疑活动,及时采取措施
6. 定期对合约进行升级和审计,确保最新的安全措施得以实施
区块链常用的攻击手段有哪些?
1. 重放攻击
攻击者将已经在一个链上广播的交易再次广播到另一个链上。通常发生在区块链硬分叉后。
以太坊通过链标识符防止重放攻击
2. 51%攻击
攻击者控制区块链网络中超51%的算力,可以控制区块链。通常针对工作量证明共识机制的区块链
3. 双花攻击
攻击者在同一笔交易中使用相同的货币资金支付给多个不同的接收者。
BTC的UXTO模型防止双花
ETH的nonce标识防止双花
4. 自私挖矿攻击
恶意矿工在找到新区块时不立即广播到网络,而是构建一个自己控制的私有链。一旦私有链比主链长,在将其发布到网络,使其他矿工挖的区块被孤立,从而获得更多区块奖励
5. 时间戳欺诈攻击
攻击者通过操纵区块的时间戳,可以提高挖矿难度,影响其他矿工收益。
6. 女巫攻击 Sybil Attack
攻击者在网络中创建大量伪造的节点,试图控制或干扰网络行为
PoW和PoS共识机制,通过提高有效节点创建的门槛,防止女巫攻击
7. 有毒合约攻击
对于支持智能合约的区块链,有毒攻击者创建并部署一个具有恶意功能的智能合约窃取用户资金、操纵其他合约或破坏区块链网络
恶意合约A: 创建一个恶意合约,合约中定义了一个 fallback 函数,该函数会消耗大量的Gas。然后诱导受害者合约B与合约A交互所示资金。
8. 分布式拒绝服务DDoS
攻击者通过大量请求来使网络的某个节点或服务瘫痪
套利攻击时怎么样的?如何避免?
套利攻击主要是针对加密货币市场和去中心化金融平台DeFi,攻击者利用市场定价不一致和不同交易平台的差异来获取利润。
1. 交易所套利
利用不同交易所之间的价格差异进行套利,并非恶意攻击
2. 去中心化金融套利
利用智能合约、流动性池和借贷平台之间的利率差异套利。如从利率低的平台借入资金,在利率高的平台存入资金,从而获得利润
3. 闪电贷套利Flash Loan
闪电贷是DiFi中一种无抵押方式,攻击者利用闪电贷在不需要抵押的情况下获得大量资金,然后利用这些资金在市场上操控资金价格。
step#1. 攻击者通过闪电贷借入大量的资产,如ETH或稳定币
step#2. 攻击者将这些资产在去中心化交易平台进行交易,由于资金量较大,可以操纵和影响资产的价格
step#3. 操纵价格后,攻击者利用操纵后的价格在其他DeFi平台进行套利
价格操控攻击有哪些?
1. 洗盘 Wash Trading
攻击者在交易所上同时大量买卖,制造虚假的交易量和价格波动,误导其他交易者
2. 买壳抛壳Pump and Dump
攻击者通过大量购买某种资产,人为推高价格,吸引其他投资者跟风买入。当价格达到一定程度,攻击者突然抛售该资产,从而获利
3. 恶意操纵预言机
攻击者在交易所通过大量交易来使预言机获取的价格数据不准确,从而影响基于这些数据的智能合约的行为
智能合约的安全实践
1. 设计阶段
明确需求,识别潜在的安全威胁,做对应的安全需求,如权限控制、数据隐私等
2. 开发阶段
书写规范代码,使用安全的库和函数
做好权限控制、对所有输入进行严格的验证、设计合约升级机制确保可以修复已部署合约的漏洞
严格的代码审查
3. 测试阶段
全面覆盖单元测试用例
在模拟环境中进行集成测试、压力测试,评估合约在真实环境的表现
安全测试,邀请专业的第三方机构对合约进行安全审计
4. 部署阶段
部署前冻结代码,防止新改动带来问题
在测试网部署测试之后再在主网上正式部署
分阶段部署项目,先部署核心部分,再部署次要部分,逐步验证每个阶段的安全性
在etherscan上验证合约代码,确保代码公开透明,所有功能按预期运行
5. 运维阶段
发现漏洞,及时修复,通过合约升级机制更新
向用户发布安全公告,告知修复的漏洞和更新
定期进行安全审计
6. 应急响应
制定详细的应急响应预案,在发生安全事件时,快速采取措施,减少损失
事后进行总结,分析原因并改进
智能合约安全设计模式
1. Check-Effect-Interaction 保证状态更新后在做外部调用
2. Mutex 通过加锁防止函数被递归调用
3. Data Segregation 数据存储和逻辑相分离
4. Satellite 分解合约功能
将复杂的合约分成多个小的子合约
5. Contract Registry 跟踪最新合约
和Satellite模式结合使用,通过专门的Registry跟踪子合约的每次升级情况,主合约通过Registry合约取得最新的子合约地址
6. Contract Relay 代理调用最新合约
与Registry功能类似,和Satellite结合使用,通过代理合约调用子合约
7. Mortal 允许合约自毁
通过字节码的selfdestruct指令销毁合约
8. Automatic Deprecation 允许合约自动停止服务
通过设置指定期限deadline后停止服务,无需人工介入
9. Ownership检查
onlyOwner
10. Commit-Reveal 延迟揭秘
允许用户将数据转换成加密数据,知道某个时候再揭示真实的原数据
智能合约编程的一些准则.
1. 精简函数变量
2. 保证参数和行为符合预期 require、revert、assert进行异常检查
3. 严控函数的执行权限
4. 抽象通用的业务逻辑
5. 预防私钥丢失
保管好合约部署者和管理者的私钥
6. 合理预留事件
7. 遵循官方安全编码规范
8. 合约部署权限控制
9. 合理的合约升级机制
10. 设置冻结和解冻操作
11. 合约废止
当合约不在使用时销毁合约
跨链交互
什么是跨链?
在不同链上转移资产或数据
跨链有哪些实现方式?
公证人机制
哈希时间锁定
侧链 & 中继联
分布式私钥控制
哪些有名的跨链项目?
Cosmos
PolkaDOT
什么是公证人机制?
本质上就是一种中介方式,通过引入共同信任的第三方作为中介,由中介完成跨链的验证和转发,如中心化交易所
缺点:有中心化风险,只支持交换不支持转移
什么是哈希时间锁定?
采用哈希锁和时间锁,强制资产在一定时间内将打款证明发给打款方,否则资产将返回原地址
缺点:只支持交换,不能做到资产和信息转移
示例:A想和B进行1BTC换50ETH的交易
1. A随机构建字符串s,并计算哈希值h
2. A将哈希值h发给B
3. A通过合约锁定1BTC并设置锁定时间T1,设置获取资产条件:B向A提供h的原值s
4. B通过合约锁定50ETH并设置锁定时间T2(T2<T1),设置获取资产条件:A向B发送h的原值s
5. A将原值s发给B的合约以获取50ETH
6. B将获得的原值s发给A的合约以获取1BTC,至此完成交易
7. 如果超时未发送,合约锁定的资产返回原地址
侧链是怎么实现的?
通过双向锚定(Two-Way Peg)技术,将资产暂时在主链锁定,然后在侧链上释放等价的数字资产。
具体实现方式
SPV模式 Simplified Payment Verification
1. B将50ETH发送给BTCSwap合约,约定若B收到A的1BTC,合约将50ETH转给A
2. A确认B已经冻结50ETH之后,将1BTC转给B
3. BTC-Relay将区块头推给BTCSwap合约,同时A将交易tx发给BTCSwap合约
4. BTCSwap合约结合交易tx和区块头进行SPV验证,验证通过后将50ETH发给A
单一托管模式 Single Custodian Model
由一个托管人或托管合约管理主链与侧链的资产转移
联邦模式 Federated Sidechains
通过受信任的验证者组管理侧链与主链之间资产转移
驱动模式 Drivechain Model
由主链矿工或节点集中驱动和管理主链和侧链的资产转移
混合模式 Hybrid Model
单一托管+驱动模式,由多个托管人或节点管理资产转移
侧链的用途?
虚拟化地横向和纵向的提升主链的性能
横向:将交易放在侧链,然后同步给主链,提升主链TPS
纵向:侧链具有更丰富的功能
虚拟化:本质上主链本身没有变化
中继链
Cosmos的中继链工作机制是什么样的?
Cosmos的核心组件是Cosmos Hub和Tendermint共识,使用IBC协议使得各个独立区块链能够通过一个去中心化的网络进行通信和交互。
IBC协议工作流程
1. 两个区块链建立连接
互相运行对方区块的轻节点,可以获得对方链的区块头信息进行SPV验证
2. 通过IBC,区块链A先冻结资产,然后将数据包发送给区块链B
3. 区块链B接收到数据包,通过区块头信息进行SPV验证其有效性,然后更新自己的状态,如释放等价的资产
4. 区块链B发送回执到区块链A,确认交易
如果区块链很多,那么IBC跨链复杂度组合级别增长,因此Cosmos网络引入了Cosmos Hub中继链。所有平行链都通过IBC协议连接到Cosmos Hub,Hub辅助跨链交易的验证和资产转移。
Cosmos网络中的每个区块链和Cosmos Hub都使用Tendermint共识,一种基于拜占庭容错的共识算法。Tendermint提供快速的区块确认和安全性,确保各个区块链的状态能被可靠传输和验证。
引入Cosmos Hub的网络中,两个区块链转移资产的流程。例如链A向链B转移100ATOM
1. 链A冻结100ATOM,生成IBC交易打包发送给Cosmos Hub
2. Cosmos Hub通过SPV验证交易有效合法性,验证通过后,在中继链上记录交易,并生成新的IBC交易发给链B
如果验证不通过,也会记录消息,并将拒绝的消息返回给链A处理
3. 链B接收到IBC交易后,通过SPV验证其有效合法性,验证通过后,释放等价资产在链B上
如果验证不通过,链B记录消息验证失败,然后通知Cosmos Hub。Cosmos Hub记录失败的消息然后可能通知链A
非Cosmos SDK开发的链如何与Cosmos Hub连接呢?
使用Peg Zone桥接。所谓Peg Zone就是Cosmos SDK开发的中间件,既能与Cosmos Hub连接,也能与原链交互的一条链。
实际应用
Osmosis去中心化交易所,利用IBC实现跨链交易
Terra区块链
Cosmos Hub代币Atom
Cosmos中继链机制的优势?
1. 每个区块链Zone相对独立,可以选择不同的功能和治理模式。
2. Cosmos网络可以容纳无限数量的Zone
3. Cosmos允许每个Zone独立维护各自的安全性和共识
Polkadot中继链的工作机制是什么样的?
Polkadot通过中继链(Relay Chain)作为核心组件实现不同区块链(平行链Parachains)之间的互操作性和共享安全性。
在整个Polkadot网络中,运行着不同角色的节点,如运行中继链的验证者节点(Validators)和运行整个平行链的收集者节点(Collators)。
提名人角色:不想直接参与验证过程的DOT持有者,可以质押代币提名自己信赖的验证者,从中获得部分奖励
当一个用户想将链A的资产转移到链B上时
1. 链A的收集者节点会将交易打包成区块提交给中继链
2. 由中继链的验证者节点验证区块交易的合法有效性,验证通过后将链A的区块状态更新在中继链上
3. 然后验证者节点会将这个跨链的交易通过XCMP协议发送给链B
4. 链B的收集者节点会验证其合法有效性,然后在链B上释放等价资产,将交易打包成区块提交给中继链
5. 中继链的验证者节点验证区块有效性,将链B的区块状态更新在中继链上
共识机制和通信协议
NPoS:Nomonated Proof of Stake
XCMP: Cross-Chain Message Passing
合约底层
合约字节码
合约字节码是存储构成智能合约逻辑的所有EVM指令集合。
合约字节码存储在单独的虚拟ROM(只读存储器)中,因此合约代码是不可变的。
存储在什么地方?·
存储在智能合约地址的账户状态下,以codeHash的形式存储
codeHash是智能合约字节码的keccak256哈希值
地址只存储哈希值,那实际的合约字节码存储在哪里呢?
在状态数据库中对应的哈希值下
什么是状态数据库?
每个以太坊客户端都在底层使用一个数据库, 如Geth的Leveldb、Nethermind的rocksdb,将数据以键值对的形式存储。
说下智能合约的创建字节码和运行时字节码
创建字节码包含运行部署合约的逻辑指令constructor
仅在部署合约时运行一次
运行时字节码是合约在区块链部署后的最终字节码,是外部调用合约后由EVM运行的代码
生成的创建和运行性字节码受哪些因素影响?
1. solc编译器的版本
2. solc编译器是否打开优化器
3. solc优化器的设置,如runs
4. 合约部署时提供的构造参数
运行时字节码的主要部分有哪些?
调度器dispatcher
主要分析calldata与函数选择器比较从而调用合约的函数
当用户请求执行合约函数时,调度器通过比较calldata和函数选择器来检查函数是否存在。如果存在则跳转到函数体执行逻辑,不过不存在则执行合约的fallback函数,未找到fallback函数就revert
具体底层的函数查找逻辑是什么样的?
首先调度器包含了所有函数的签名列表,调用时调度器通过反汇编将calldata与函数签名逐个比较,当与签名相匹配时,通过EQ操作码找到函数体的文职,调转过去执行函数体的逻辑。
函数包装器
主要解包/拆包 函数参数,并包装函数体返回的值
函数主体
包含函数的主要逻辑
其他
自由空闲指针
calldata
合约元数据
在solidity中如何访问合约代码?
1. <address>.codehash
2. <address>.code
3. type(contractName).creationCode
4. type(contractName).runtimeCode
isContract(address)
openzeppelin库的一个函数,通过检查地址下是否包含字节码,判断地址是合约地址还是外部账户地址。
4.4.2之前使用extcodesize(address)>0操作码来检查,4.5.0之后使用addres.code.length>0来判断
函数漏洞
当返回false时不一样代表该地址不是合约。因为isContract的调用可能在从合约的构造函数调用的,当被检查的地址是通过create2预设的并且合约尚未部署。
solidity合约数据存储
solidity合约为每项数据指定一个可计算的存储位置,数据存储在2**256的超级数组中,每个位置可存放32个字节,数据初始值为0
如何存储定长的数据?
当数据是固定大小的值类型时,编译时严格按照顺序依次分配到指定位置,当数据值用不到32个字节是,编译器会将这个数据与后面的数据尽可能的放置到一个存储位置上,以节约存储。
如何存储动态数组?
数组长度存在主槽slot上
数据存储在keccak256(slot)中
如何存储字符串?
长度小于32字节时,长度和数据存储在同一个slot上
长度大于32字节时,长度存储在主槽slot上,数据存储在keccak256(slot)位置上
如何存储映射数据?mapping
字典存储在主槽slot上
每个key一个存储,存储对应的value,存吃的位置是通过对key和slot的哈希计算所得
通过keccak256计算数据存储插槽位置会不会出现位置重复的情况?
理论上会存在,但是keccak256的值范围非常大,出现重复的概率极小。
solidity进阶
gas优化技巧
1. 减少不必要的状态变量,对于不需要长期保存的数据,使用事件代替存储
2. 对于不可变的变量,使用constant和immutable关键字修饰
4. 使用高效的数据结构,如使用mapping代替array提高gas利用率
4. 只读函数使用view和pure关键字修饰
5. 避免使用循环和迭代,如果必须使用也尽量把循环次数限制在合理范围内
6. 简化合约函数,将常用的操作封装成内部函数,减少代码重复
7. 复杂的合约进行必要的拆分和模块化设计
8. 使用低级代码或内联汇编节省gas
内联汇编直接编写evm指令,跳过solidity编译器生成的中间代码
9. 减少外部合约的交互次数,可以的话使用multiCall
10. 合理处理异常和边界情况
11. 合理设置gas限制,避免gas不足导致交易失败
部署优化
在内部函数和修饰器之间平衡
修饰器部署时需要额外的gas,但运行时可以减少gas
自定义错误和require语句之间权衡
错误消息过长时,require消耗更多的gas
自定义错误编码更紧凑,执行更高效
使用现有的create2工厂部署合约
提前预测合约地址,避免重复部署,节省gas
通过salt和init_code计算地址
keccak256(0xFF, sender, salt + keccak256(init_code))[12:]
合约升级
UUPS合约升级模式和透明升级代理模式的区别?
UUPS模式
UUPS模式中,代理合约是一个轻量级的合约,只负责委托调用逻辑合约。这个模式下的升级逻辑放在了逻辑合约中,逻辑合约需要实现一个upgradeTo的升级函数,以便合约升级时将逻辑合约指向新实现的合约。
代理合约比较轻量,部署和执行时gas消耗低,但因为逻辑合约本身负责处理升级功能,需要开发者小心设计避免升级漏洞
透明升级代理模式
透明升级代理模式下,代理合约包含指向逻辑合约的地址,负责升级逻辑,由ProxyAdmin管理员合约执行升级操作。而逻辑合约只专注于执行非管理员的业务操作。
提供简单而直接的方式管理合约升级,升级逻辑由ProxyAdmin集中管理,比较适合简单升级场景
UUPS升级模式示例
1. 逻辑合约继承UUPSUpgradeable,实现_authorizeUpgrade函数
2. 通过ether.getContractFactory获取逻辑合约工厂
3. 通过upgrades.deployProxy()部署代理合约
3.1 部署代理合约
3.2 与逻辑合约建立链接
3.3 初始化逻辑合约
3.4 返回代理合约的地址
4. 需要升级时,获取v2的逻辑合约工厂,然后通过upgrades.upgradeProxy(proxyAddress, v2)升级到v2
如果升级后的合约新增了状态变量,代理合约如何处理这些新增状态变量?
首先,代理合约拥有和逻辑合约一致的存储布局,因此新合约也要保持一致的存储布局
为了保持升级后的存储布局和旧版本兼容,新的状态变量要添加到存储的末尾
其次,我们可以在初始版本的合约中,预设一些占位符变量 uint256[50], 预留存储槽位
其他
常见的链上定价模型
AMM曲线
目前共识最强的链上定价范式,x * y = k定价曲线,首次由uniswap提出。
其中,x是流动性池中x资产的数量,y是流动性池中y资产的数量,k是一个常量。当向池中流入x资产时,k保持不变,则y资产数量变小,减少的值即流出的y资产数量。
模型问题
初始流动性的来源困难,对于早期项目方而言,发行资产一定需要大量的资产进行流动性提供。
Bonding Curve
通过特定的公式,根据供应量计算发行代币价格。
模型问题
价格完全依赖数学函数,机制过于透明,无法长时间运行。往往是早期的投资者获得较大的收益,而中期的投资者受损。
拍卖方案
荷兰拍卖:链上最多的拍卖方式。标的资产从提前设置的最高价起拍,随着时间推移,价格逐渐降低,直至成交
英式拍卖:在固定时间内,标的资产价格逐步提高,直至拍卖结束以最高价成交。
渐进式荷兰拍卖、可变利率荷兰式拍卖
模型问题
并没有解决流动性问题,而且资产拍卖结束后,代币发行方很可能soft rug
ERC7527
综合了不同方案的优点,首先在Bonding Curve原有的范式内引入拍卖机制,使得博弈更加动态,避免过于透明的机制导致的问题。其次,ERC7527选择将用户所注入的资产用于发行资产的做市,避免发行资产的流动性问题,特别是解决了AMM初始流动性问题。最后,ERC7527保留了策展市场的相关能力,参与wrap的用户实际都是利益共同体,会主动推动agency的发展。
金库
通常指的是一个智能合约账户,存储平台上的资金,用于支持项目的长期发展和运营
锁币池
用于暂时锁定用户的代币,通常与质押和奖励分配相关。通过锁币池,项目方能够激励用户持有和质押代币,减少市场波动,并支持项目的长期发展
代币发行和交易手续费的分配比例
代币发行
金库 40%~60%
50%
个人账户(团队/开发者/投资者) 10%~20%
15%
锁币池(质押奖励)20%~40%
35%
手续费分配
平台 30%~50%
40%
质押者 30%~50%
50%
流动性提供者 10%~20%
10%
质押者和流动性提供者区别
参与方式
质押者锁定代币
流动性提供者将一对或多对资产存入流动池
主要目的
质押代币用于权益证明机制或其他激励机制
提供交易流动性,减少滑点
主要收益
质押奖励、手续费分成
流动性奖励、手续费分成
解锁条件
质押通常有一定的锁定期,解锁后可提取
流动性提供者可以随时提取流动性,但可能面临无常损失
代币发行量一般设置
初始总供应来那个1亿
分配策略
平台金库50%
团队和开发者15%
社区和质押奖励25%
初始流动性和市场推广10%
什么是soft rug
一种相对隐蔽的骗局或恶意行为,如项目方逐渐抛售代币、减少开发运营、撤回流动性等
简述下solr
solr是一个高效的全文检索引擎,通过分词器和倒排索引可以高效的实现大文本数据查找和模糊查询查找
0 条评论
下一页