1.比特币加密货币——不加密,公开

比特币中的hash函数:SHA(Secure Hash Algorith)—256

2.区块链——一个个区块组成的链表

3.cryptographic hash function(哈希函数)

  1. collision(哈希碰撞)【不可避免】 resisitance:用来检测对信息的篡改

    注意:该性质无法被证明,无法被人为制造

    例:md5,现已不安全

  2. hiding(hash函数的运算是单向的):和(1)结合实现digital commitment(数字签名) 或digital equivalent of a sealed ecvelope(数字等效的密封信封)

    解释:X—>H(X) H,H(X)不能得到X

    注意:输入的空间要足够大且均匀(可以在输入空间后加一个随机数来实现,如H(X||nonce))

  3. puzzle friendly (hash值的运算是不可预测的):proof of work(工作量证明)
    注意:difficult to solve,butt easy to verify(难以解决但易于计算)

4.签名

1开户:创建一个(public key,private key)公私钥对
作用:用作数字签名
(2)生成公私钥:需要a good source of randomess(好的随机源)

注意:比特币中一般都是对message取hash,在对hash进行签名

1.hash pointers(哈希指针):不仅要保存结构体地址还要保存其hash值

注意:(1)区块链中每个区块都有指向它的hash指针包括最后一个区块,最后一个区块的指针保存在系统
![[Pasted image 20240423114052.png]]

(2)指针是计算前一个区块的全部内容包括指针计算出来的(更改前面内容后面指针均改变)

作用:tamper—evident log(防篡改日志):可得知区块链是否得到篡改

优点:不仅能知道位置还知道内容

2. merkle tree(复杂度:log(n)):
(1)提供merkle proof (proof of membership或 proof of inclusion):数据篡改证明,数据存在证明

(2).可通过进行hash值的排序来建立sorted merkle tree,用两个相邻的hash值向上推到merkle root,如无误,则未被篡改。从而提供proof of non-membership(比特币中没有,因为不需要证明)

]]![[Pasted image 20240423114215.png]]![[Pasted image 20240423114233.png]]

Bitcoin and anoimity(比特币和匿名性)

可能破坏比特币匿名性的因素

1.可以通过分析比特币钱包的转账交易来分析出不同地址之间的关联
2.资金的转入转出:交易所,私下交易
3.现实世界中支付比特币买东西,例:比特币转换为法币
silk road(ebay for illegal drugs):著名黑站(地下交易:非法物品买卖,用比特币交易-)——运行两三年被查封
注意:比特币的匿名性并不好,中本聪属于个例。

采取什么方法提高匿名性

![[Pasted image 20240419222322.png]]
1.比特币的协议运行在应用层,在应用层:coin mixing(把每个人的币混在一起) 例:在线钱包,交易所,专业网站
2.网络层的匿名性可以用多路径转发(例:TOR,silk road的方法)

零知识证明

1.零知识证明是乙方(证明者)无需向另一方(验证者)证明一个陈述是正确的,但无需透露该陈述是正确外的任何信息
2.数学基础:同态隐藏![[Pasted image 20240419224050.png]]
第二个:hiding property 第三个:同态运算
例:![[Pasted image 20240419224416.png]] ![[Pasted image 20240419224531.png]]可以对x,y进行随机化处理,但使x+y相等

![[Pasted image 20240419225326.png]] 零币和零钞![[Pasted image 20240419225351.png]]

但这仍然没解决与实体交易的联系产生的匿名性问题

1.普通数字货币:非对称加密

缺点:很难防御double spending attack(双花攻击)

2.区块链货币(例:比特币): 防御 double spending attack

(1)A—>B的交易存在两个指针,分别是A指向B的指针,A指向交易币来源的指针
(2)A—>B的交易要知道A需要知道B的地 址(相当于银行账户)和B要知道A的公钥
注意:比特币本身并没有告知B地址的机制,必须借助第三方网站
不仅是B本身要知道A的公钥,其他所有节点都需要知道A的公钥已验证交易的合法性
A的币的来源中存在A的公钥的hash,所以不存在假冒A的情况

3.区块链常识

hyperledger(联盟链):成员享有投票权
block chain(区块链):去中心化的账本
Block Header(区块头) :被取hash
Block Body(块身) :存储transaction list(交易列表)
revsion(协议):Paxos(能够保持一致性)
hash of previous block header(指向前一个区块的指针) Merkle root hash(merkle tree的根hash值)
target(挖矿的难度阈值)
nonce(随机数)
H(block header) <= target : block header存储target的编码
full node——fully validating node(全节点):保存所有信息
light node (轻节点):只保存block header的信息,一般来说无法独立验证交易的合法性,系统中占大多数
![[Pasted image 20240321214500.png]]
指针在上面只因为只有Block header里存在hash指针串联

4.distributed consensus(分布式共识)

例:distributed hash table(分布式hash表): 取得的共识:hash表中存在哪些key-value pair(键值对)
impossibility result(不可能结论):
(1)FLP impossibility result:在一个asynchonous(异步系统:网络传输没有上限),只有一个成员存在问题,也不可能达成共识
(2)CAP(Consistency(一致性) Availability(容忍性) Partition tolerrance(分区可用性)) Theorem: 这三个原理最多只能实现两个

5.Consensus in Bitcoin(比特币中的共识协议)

(1)sybil attack(女巫攻击):某一个平台掌握一半以上的membership(账户)来掌控投票结果——简单直接投票不行的原因
(2)算力投票:H(block header)<=target,找到一个nonce使上列等式成立的账户获得创建下一个区块的权力(和记账权)
注意:插入区块遵从longest valid chain(最长链原则)
在中间插入区块也叫做forking attack(分叉攻击)
在同时发布区块的情况下,先找到下一个区块的链是longest valid chain(最长合法链)
(3)block reward(出块奖励):获得记账权的节点会获得coinbase transaction(铸币交易)的权力
注意:铸币交易是发行比特币的唯一方式
最开始一个区块50个BTC,在21W的区块后减半,最多发行2100w枚
节点的hashrate(每秒钟尝试的nonce数目)越高获得记账奖励的机会越高
![[Pasted image 20240406193131.png]]

==自己纠错==
==GPT纠错==
stack overflow:技术论坛
stack exchange:智能合约论坛
/ethdev :以太坊开发者社区
codewars:编码挑战

如何提问:

  • 复制代码
  • 根据markdown语法格式化代码
    • 
      
  • 错误信息
  • 记得帮助别人

cryptoslam NFT
https://etherscan.io/ 以太坊状态
ocaml语言(函数式编程语言)
后现代魔法 %% 256235799 %%
黑客松:chainlink,ETH Global,Devfolio
ICO(Initial Coin Offering):
IPO(Initial Public Offering):
API(application programming interface):应用程序接口
溢出现象:当你定义的数字超过最大值,会从最小值开始
构造函数:就是不同函数,首字母要大写
stack overflow:技术论坛
stack exchange:智能合约论坛
智能合约相关知识:

  • 枚举
  • 事件
  • try catch
  • 函数选择器
  • abi编码
  • hash
  • YUL/ASSEMBLY

SUI

●0x1:MOVE 标准库 std ,是 MOVE 语言的工具包。

●0x2:Sui 框架 sui ,是 SUI 区块链场景中常用的一些工具包。

●0x5:SuiSystem对象的地址

●0x6:Clock对象的地址,该对象存储自 Unix 纪元以来的当前

●0x8:Random 对象的地址。

![[Pasted image 20240329182657.png]]
1.监听别的矿工的区块,验证合法性:
注意:1.检查block header 前面有多少个零
2.检查target值
3.检查是否在最长合法链
![[Pasted image 20240329185325.png]]
2.在新区块发布时要放弃之前挖矿的尝试,对新区块的下一个区块进行尝试
3.比特币通过密码学和共识机制来保证安全性
4.挖矿演化:
cpu(性价比低)——>gpu(为通用并行工作而设计,效率有提高)——>ASIC(Application Specific Integrated Ciral)芯片——只能挖使用同一种mining puzzle的加密货币
5.挖矿趋势——大型矿池的出现(聚集大量散户的算力集中挖一个区块)![[Pasted image 20240406191750.png]]计算哈希值由miner(矿工负责),发布等其他工作由负责pool manager(矿主)负责,由工作量证明分配
注意:1.工作量证明:miner想pool manager提交share ——almost ralid block(和区块难度差不多的区块),矿主在挖到真正的区块时由发布share的数目分配btc
2.miner不可能自己发布真正的区块,因为miner挖矿时使用的是pool manager的地址
3.矿池的危害:加大了51%攻击的可能性 ——1.分叉攻击
![[Pasted image 20240406193720.png]]
2.Boycott(封锁账户) ——和A有关的交易发生时,立刻产生和A无关的区块 ,使A无法在链上进行交易 ![[Pasted image 20240406193928.png]]

  • 沙盘+大屏
    • 目的:食品溯源
      • 滴灌区域:无人机灌溉
      • 传感器
      • 工作平台模拟食品生产
        • 针对食品有溯源码
          • 根据溯源码上链
            • 屏幕上由合约数据

mining(挖矿)——不断的尝试nonce值使H(block header)<= target
注意:比特币采用的是SHA-256 所以产生的可能为2的256次方
挖矿难度公式:![[Pasted image 20240329175628.png]]

挖矿时间过短:

1.可能出现分叉(多个区块同时被挖出时)使51%attack不需要51%的算力![[Pasted image 20240329180346.png]]

调成挖矿难度

1.比特币每2016个区块(14天)调整一次挖矿难度![[Pasted image 20240329181057.png]]
2.如果有节点不调整挖矿难度,则其他节点通过验证block header中的nBits域值来不认可该节点发布的区块
3.coinbase(铸币)域(8字节)可以当作extra nonce来调节挖矿难度
注意:nonce域(8字节)
![[Pasted image 20240329182343.png]]

==在发布智能合约时要不断测试==

![[Pasted image 20240429153056.png]]

  • solidity语言不支持遍历
  • 智能合约的执行都在在修改本地的数据,只有在执行完并发布到区块链上之后才会成为共识
  • 要先执行合约,在挖矿
    • 要先知道block header中的三棵树的root hash才能开始挖矿
  • solidity不支持多线程
    • 执行结果不确定
  • ==在区块链上调用任何未知的合约都是危险的,要处处小心==
  • 外部账户如何调用智能合约

    • 创建一个交易,接收地址为调用的那个智能合约的地址,data域填写要调用的函数及其参数的编码值
  • 一个合约如何调用另一个合约中的函数

    • 直接调用
      • ![[Pasted image 20240429154013.png]]
    • 使用address类型的call()函数
      • ![[Pasted image 20240429154358.png]]
    • 代理调用delegatecall()
      • 不需要再被调用的合约执行,可以带在殿前合约中执行
  • fallback()函数
    • 匿名函数,无参数和返回值
    • 两种情况会被调用
      • 直接像一个合约地址转账而不加任何data
      • 被调用的函数不存在
    • 转账金额不为零,仍需要声明payable
    • 只有合约账户才有fallback和payable,外部账户没有

智能合约的创建和运行

  • 创建账户:
    • 外部账户发起一个转账交易到0x0的地址
    • 把合约的代码放在data域里面
    • 转账金额为0
  • 运行在EVM上(Ethereum Virtual Machine)256位 -:提供一个虚拟机,让智能合约提供一个一致的平台

汽油费(gas fee)

  • 智能合约是一个turing-complete Programming Model(图灵完备模型)
  • 出现死循环怎么办
    • 执行合约的指令要收取gas fee,由发起交易的人来支付
      • ![[Pasted image 20240429160438.png]]
        • price是单位gas价格
        • gaslimit是能支付的最大gas值
        • payload是data域
      • 先支付最大汽油费,然后多退,少的话就回滚交易
        • 但是已经消耗的gas不会返还
          • 防止攻击
      • EVM中不同指令的gas fee不同
        • 复杂的或需要存储状态的指令会比简单的昂贵
  • block header里的gas limit是区块中所有交易的gas fee的上限
    • 在发布区块时新的区块可以把gas limit上调或下调至少1/1024
  • 收取gas fee时,在本地维护的状态树上扣除余额

错误处理

  • 智能合约没有try-catch
    • 出现错误用户不能自己决定行为
  • ETH中的交易具有原子性,要么执行要么不执行。
    • 在智能合约的执行出现任何错误,会直接回滚
  • asssert语句:
    • 判断内部条件
  • require:
    • 外部条件
      • 例:函数输入是否符合要求
  • revert:
    • 无条件执行错误

嵌套调用

  • 调用一个合约调用另一个合约的函数
    • 直接调用会引起发起调用合约的回滚
    • 函数调用不会
  • 一个合约向另一个合约账户转账,没有指明调用那个函数,仍会引起嵌套调用

receipt数据结构

  • ![[Pasted image 20240429165601.png]]
    • 收据内容

智能合约可以得到的区块内容

  • 给定区块的hash——最近256个
  • 挖出当前区块的miner地址(coinbase)
  • 当前区块的难度
  • gas限额
  • 当前区块号
  • 自unix epoch起始当前区块的时间戳

可以得到的调用信息

![[Pasted image 20240429171013.png]]

地址类型

![[Pasted image 20240429171107.png]]

  • transfer会导致连锁式回滚
  • call的转账会把剩余的所有gas全发过去

智能合约实例

![[Pasted image 20240429172955.png]]
上面合约应定义一个fallback函数,否则会报错,导致连锁性的回滚,里面的钱会被永久锁定
code is law
irrevocavle trust
![[Pasted image 20240429174754.png]]

  • 重入攻击(Re-enteancy Attack)
    • 当合约账户收到ETH,但为调用函数时,会自动执行fallback函数
    • 三种转帐方式都会处罚fallback函数
    • fallback函数由用户自己书写![[Pasted image 20240429175108.png]]
    • ![[Pasted image 20240429175358.png]]![[Pasted image 20240429175700.png]]

transaction—based ledger(基于交易的账本)

(1).UTXO(Unspent Transaction Output):没被花掉的输出

作用:为了检测double spending(双花攻击)——检测交易合不合法
(2).transactiion fee(交易费)
![[Pasted image 20240324172248.png]]
(3).通过修改nonce域和merkle root hash(这个是通过修改coinbase来实现的)来调整挖矿难度来保证每个区块的产生时间在每个十分钟左右
(4)比特币系统通过提供来源的输出脚本和原本交易的输入脚本配对来检测交易的合法性,如配对后能正常执行则合法
![[Pasted image 20240324173000.png]]
(5).Bernoulli trial:a random experiment with binary outcome
Bernoulli process:a sequence of independent Bernoulli trials
性质:memoryless(无记忆性):前面的实验不会影响和后面实验的概率
可近似于poisson process(泊松分布):因为两种情况概率差距过大
![[Pasted image 20240324174339.png]]
y轴: probability density (概率分布)
x轴:time to nexr block(出块时间)
比特币的保护机制:
Bitcoin is secured by mining(比特币被挖矿机制保护)
(1)![[Pasted image 20240324180112.png]]
恶意的节点强行写入交易(偷比特币)不会被前一个诚实的节点认可,从而会产生分叉,分叉的链会作为最长合法链,而恶意节点的链会变成非法并失去出块奖励
(2)防止double spending :
![[Pasted image 20240324181108.png]]six confirmation(系统在经过6个confirmation后才认为是无法篡改的)从而不能造另一个最长链
zero confirmation(0的确认):发布出去后还未写入区块链中—节点只接受第一次收到的信息,第二次直接放弃
![[Pasted image 20240324181607.png]]
(3).节点放弃某些合法交易:这些合法交易可以被写入其他诚实结点
(4).selfish mining(发到区块不立刻发布):需要巨大的算力(如51%算力)极难实现,且风险巨大,利益与风险不符
目的:
在six confirmation后发布,从而掠夺最长合法链
防止别人竞争出块奖励