Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add SHARP of starEX #1224

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
230 changes: 230 additions & 0 deletions defi/DYDX/shard.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,230 @@
# SHARP(Shared Prover)技术概述

SHARP 是 StarkWare 开发的一种共享证明服务,旨在为多个应用生成有效性证明。它基于 STARK(Scalable Transparent Argument of Knowledge)技术,提供高效、安全的零矩矢证明。

## **工作原理**

SHARP 的主要功能是接收来自不同应用的证明请求,并生成相应的 STARK 证明。其工作流程如下:

1. **接收请求**:应用程序将交易数据和执行结果发送至 SHARP。
2. **生成证明**:SHARP 使用 Cairo 语言编写的程序,对数据进行处理,生成 STARK 证明。
3. **提交证明**:将生成的证明提交到以太坊主网,由链上合约验证其有效性。

## **技术细节**

### **Cairo 语言**
SHARP 使用 Cairo 编写验证逻辑。Cairo 是一种图灵完备的编程语言,专为生成高效的 STARK 证明而设计。它允许开发者定义复杂的业务逻辑,同时保持高效的证明生成能力。

### **STARK 证明**
- **高扩展性**:支持批量处理大量交易,显著提升吞吐量。
- **透明性**:不需要可信设置,任何人都可以验证其有效性。
- **量子安全**:对抗量子计算攻击提供更高的安全保障。

## **优势**

- **共享性**:SHARP 可同时为多个应用生成证明,提高计算资源利用率。
- **高效性**:通过批量处理交易,显著降低单个应用的计算成本。
- **安全性**:利用 STARK 技术,确保交易数据的隐私和完整性。

## **应用场景**

SHARP 广泛应用于高扩展性和高安全性需求的场景,包括:
- 去中心化交易所
- 支付系统
- 区块链游戏

## **参考资料**

- [解析StarkWare的架构与生态:估值80亿美元的扩展潜力](https://zhuanlan.zhihu.com/p/530091142)
- [万字拆解 StarkWare:80 亿美元的「以太坊扩展最佳团队」是否高估?](https://web3caff.com/zh/archives/18842)

---

## **Cairo 示例代码**

### 验证单个计算加密逻辑

以下是一个简单的 Cairo 程序,用于验证输入是否是某个数的平方。

```cairo
%builtins output

func main{output_ptr : felt*}():
let x = 3
let y = 9
assert x * x = y # 验证 y 是否为 x 的平方
return ()
end
```

### **代码解释**:
- **%builtins output**: 声明 Cairo 程序所需的内容构件。
- **assert 语句**: 验证 `x` 的平方是否等于 `y`。

---

### 批量验证逻辑

以下展示了一个批量处理交易验证的 Cairo 示例:

```cairo
%builtins range_check

from starkware.cairo.common.serialize import serialize_word

func validate_transactions{range_check_ptr}(transactions: felt*, n: felt) -> (result: felt):
alloc_locals
local sum = 0
for i in range(n):
let transaction = [transactions + i]
assert transaction > 0 # 确保交易金额为正
let sum = sum + transaction
end
return (sum)
end

func main{range_check_ptr}():
let (result) = validate_transactions([5, 10, 15], 3)
serialize_word(result) # 输出验证结果
return ()
end
```

### **代码解释**:
- **validate_transactions**:验证多个交易并计算总和。
- **assert 语句**:确保每笔交易的金额为正。
- **serialize_word**:序列化输出验证结果。


### 批量验证并生成响应的加密哈希

以下示例显示如何为批量处理交易生成加密哈希:

```cairo
%builtins range_check pedersen

from starkware.cairo.common.pedersen_hash import pedersen

func hash_transactions{range_check_ptr, pedersen_ptr}(transactions: felt*, n: felt) -> (hash: felt):
alloc_locals
local hash = 0
for i in range(n):
let transaction = [transactions + i]
assert transaction > 0
let hash = pedersen(hash, transaction) # 将交易金额加入哈希
end
return (hash)
end

func main{range_check_ptr, pedersen_ptr}():
let transactions = [5, 10, 15]
let n = 3
let (result) = hash_transactions(transactions, n)
return ()
end
```


## **Solidity 合约示例**

以下是与 StarkEx 系统交互的 Solidity 合约,用于验证 STARK 证明。

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IStarkVerifier {
function verifyProof(bytes calldata proof, uint256[] calldata publicInputs) external returns (bool);
}

contract StarkProofVerifier {
IStarkVerifier public starkVerifier;

constructor(address _verifier) {
starkVerifier = IStarkVerifier(_verifier);
}

function verifyTransactionProof(bytes memory proof, uint256[] memory inputs) public view returns (bool) {
return starkVerifier.verifyProof(proof, inputs);
}
}

### **批量验证交易的 Solidity 合约**

以下扩展了批量验证功能,允许验证多个 STARK 证明:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IStarkVerifier {
function verifyProof(bytes calldata proof, uint256[] calldata publicInputs) external returns (bool);
}

contract BatchStarkProofVerifier {
IStarkVerifier public starkVerifier;

constructor(address _verifier) {
starkVerifier = IStarkVerifier(_verifier);
}

function verifyBatchProofs(bytes[] memory proofs, uint256[][] memory inputs) public view returns (bool[] memory) {
require(proofs.length == inputs.length, "Mismatched inputs and proofs length");

bool[] memory results = new bool[](proofs.length);
for (uint256 i = 0; i < proofs.length; i++) {
results[i] = starkVerifier.verifyProof(proofs[i], inputs[i]);
}
return results;
}
}
```

### **代码解释**:
- **批量验证方法**:`verifyBatchProofs` 接收多个证明和输入数组,依次验证每个证明。
- **输入长度验证**:确保证明和输入的数组长度一致。
- **返回值**:返回一个布尔数组,每个布尔值对应一个证明的验证结果。

---

## **链下与链上交互示例**

以下展示了如何将链下生成的 STARK 证明提交至链上验证。

### **链下 Python 示例**:

```python
from starkware.crypto.signature.fast_pedersen_hash import pedersen_hash
from starkware.starknet.services.api.gateway.transaction import InvokeFunction

def generate_proof_and_inputs(transactions):
# 计算交易的哈希值
hash_value = 0
for tx in transactions:
assert tx > 0 # 验证交易金额
hash_value = pedersen_hash(hash_value, tx)

# 模拟生成 STARK 证明(伪代码)
proof = "mock_proof_data"
public_inputs = [hash_value]
return proof, public_inputs

# 示例交易数据
transactions = [5, 10, 15]
proof, public_inputs = generate_proof_and_inputs(transactions)

# 提交到链上的交易示例
invoke_tx = InvokeFunction(
contract_address="0xVerifierContractAddress",
entry_point_selector="verifyTransactionProof",
calldata=[proof, *public_inputs]
)
```

### **链上 Solidity 合约交互**:

```solidity
// 提交验证交易
contractAddress.verifyTransactionProof(proof, publicInputs);
```

55 changes: 39 additions & 16 deletions defi/DYDX/starkex.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,39 @@
## Starkex 合约
dYdX: L2 Perpetual Smart Contract
dYdX: L2 On-Chain Operator

https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/interactions/Deposits.sol
https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/interactions/Withdrawals.sol
Dydx页面显示
https://dydx.l2beat.com/
转账过程
转账15USDT到 dYdX: L2 Perpetual Smart Contract(15-2022-11-15 12:10:59 PM)
L2 Perpetual Smart Contract
https://dashboard.tenderly.co/tx/mainnet/0x8ea3a15828fb5814091d3fc246920228c1c1480086f467978fe357f5bf3a2ac4?trace=0.8.1.1.0.7
状态确认
https://etherscan.io/tx/0x7985593db99c33fa851a196bd8b374221c6063fc654278c9d85d163c29dbcb06
https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/starkex/interactions/UpdateState.sol performUpdateState
updateState(uint256[] publicInput, uint256[] applicationData)
dYdX 为了提升交易性能和降低成本,采用了 StarkWare 开发的 StarkEx 作为其二层扩展方案。StarkEx 提供了更高效的交易处理能力,与其他扩展方案相比,其利用零知识证明技术的独特优势包括更低的 gas 费用和更高的扩展性。

**StarkEx 技术架构**

StarkEx 利用 STARK(Scalable Transparent Argument of Knowledge)技术,为 dYdX 提供高效的交易处理能力。其核心组件包括:

- **StarkEx 服务(StarkEx Service)**:处理用户的交易请求,并将其打包成批次,提升交易吞吐量。
- **SHARP(SHARed Prover)**:为每个交易批次生成有效性证明,确保交易的真实性和数据隐私。
- **Stark 验证器(Stark Verifier)**:在以太坊主网上验证这些证明的有效性,确保链上状态的准确性。
- **Stark 合约(Stark Contract)**:在链上管理状态更新,保障整个系统的安全性和一致性。

用户的交易首先由 StarkEx Service 处理,随后 SHARP 生成相应的有效性证明。Stark Verifier 验证该证明后,Stark Contract 在以太坊主网上更新状态,从而实现快速且安全的交易处理。

**StarkEx 合约**

StarkEx 的合约设计涵盖多个模块,用于处理存款、取款和状态更新:

- **Deposits.sol**:管理用户存款的合约模块,用于将资产从 L1 转移到 StarkEx 系统。
[查看代码](https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/interactions/Deposits.sol)
- **Withdrawals.sol**:负责处理用户从 StarkEx 系统提取资产到 L1 的逻辑。
[查看代码](https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/interactions/Withdrawals.sol)
- **UpdateState.sol**:核心合约模块之一,用于执行状态更新操作,支持高效的批量交易验证。
[查看代码](https://github.com/starkware-libs/starkex-contracts/blob/StarkExchange-v4.5/scalable-dex/contracts/src/starkex/interactions/UpdateState.sol)

updateState 函数示例:
```solidity
updateState(uint256[] publicInput, uint256[] applicationData)
```
此函数通过接收公共输入和应用数据,完成系统状态的更新。

**实际应用示例**

- 在 dYdX 平台上执行交易时,用户资金被转入 **L2 Perpetual Smart Contract** 中。例如:
[转账交易示例](https://dashboard.tenderly.co/tx/mainnet/0x8ea3a15828fb5814091d3fc246920228c1c1480086f467978fe357f5bf3a2ac4?trace=0.8.1.1.0.7)
- 交易完成后,状态更新操作的执行记录可在以太坊区块链上验证:
[状态确认交易](https://etherscan.io/tx/0x7985593db99c33fa851a196bd8b374221c6063fc654278c9d85d163c29dbcb06)

更多关于 dYdX 和 StarkEx 的细节可以参考其 [状态仪表盘](https://dydx.l2beat.com/),了解实时数据与合约交互记录。

Loading