Skip to content

Commit

Permalink
feat: add SHARP of starEX (#1224)
Browse files Browse the repository at this point in the history
* wip: add starkEX process

* wip: add sharp

* feature: add BatchStarkProofVerifier example

* docs: add example and dydx explorer
  • Loading branch information
SpiderMan670 authored Jan 6, 2025
1 parent b41e56c commit 984d3a5
Show file tree
Hide file tree
Showing 2 changed files with 269 additions and 16 deletions.
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/),了解实时数据与合约交互记录。

0 comments on commit 984d3a5

Please sign in to comment.