Flutter插件dart_kzg_4844_util的介绍与使用

Flutter插件dart_kzg_4844_util的介绍与使用

dart_kzg_4844_util 是一个针对以太坊改进提案(EIP)4844的Dart实现。该插件主要用于生成和验证与Blob相关的承诺和证明。在本示例中,我们将展示如何使用 dart_kzg_4844_util 插件来生成和显示这些数据。

示例代码

import 'package:convert/convert.dart';
import 'package:dart_kzg_4844_util/dart_kzg_4844_util.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  BlobTxSidecar? sidecar;
  BlobTxSidecar? blob20Sidecar;
  KzgSetting? kzgSetting;

  @override
  void initState() {
    _kzgTest();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(),
          body: Column(
            children: [
              if (sidecar != null) sidecarView(),
              if (blob20Sidecar != null) blob20SidecarView(),
            ],
          )),
    );
  }

  void _kzgTest() async {
    await DartKzg4844Util.init();
    await loadSetting();
    _generateCommitmentAndProof();
    _blob20CommitmentAndProof();
  }

  Future<void> loadSetting() async {
    kzgSetting = await KzgSetting.loadFromFile('assets/trusted_setup.json');
  }

  Widget sidecarView() {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: List.generate(sidecar!.blobs.length, (index) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
                "commitment = ${hex.encode(sidecar!.commitments[index].commitment)}"),
            Text("proof = ${hex.encode(sidecar!.proofs[index].proof)}"),
            Text("hash = ${hex.encode(sidecar!.blobHashes()[index])}"),
            const Divider(),
          ],
        );
      }).toList(),
    );
  }

  Widget blob20SidecarView() {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: List.generate(blob20Sidecar!.blobs.length, (index) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
                "commitment = ${hex.encode(blob20Sidecar!.commitments[index].commitment)}"),
            Text("proof = ${hex.encode(blob20Sidecar!.proofs[index].proof)}"),
            Text("hash = ${hex.encode(blob20Sidecar!.blobHashes()[index])}"),
            const Divider(),
          ],
        );
      }).toList(),
    );
  }

  void _generateCommitmentAndProof() async {
    final blobs = <Blob>[];
    final commitments = <KzgCommitment>[];
    final proofs = <KzgProof>[];

    /// blob1
    // blobs.add(await Blob.randBlob());
    /// commitments hash with Blob contain all 0
    /// 010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014
    /// blob2
    blobs.add(Blob.zeroBlob()); // 全0

    for (var b in blobs) {
      final commit = await Kzg4844.kzgBlobToCommitment(b, kzgSetting!);
      commitments.add(commit);
      final p = await Kzg4844.kzgComputeBlobKzgProof(b, commit, kzgSetting!);
      proofs.add(p);
    }

    sidecar = BlobTxSidecar(
      blobs: blobs,
      commitments: commitments,
      proofs: proofs,
    );

    setState(() {});
  }

  void _blob20CommitmentAndProof() async {
    // https://etherscan.io/blob/0x01fc0a717777b0e983ce71eecae52ae24bdfd06459801ba5c20692ef11ca75c9?bid=706618
    const mintBlob20 =
        '{"protocol":"blob20","token":{"operation":"mint","ticker":"ETHS","amount":1000}}';

    final cborData = cborEncodeApplicationJson(mintBlob20);
    final blobs = cborDataToESIP8Blobs(cborData);
    final commitments = <KzgCommitment>[];
    final proofs = <KzgProof>[];

    for (var b in blobs) {
      final commit = await Kzg4844.kzgBlobToCommitment(b, kzgSetting!);
      commitments.add(commit);
      final p = await Kzg4844.kzgComputeBlobKzgProof(b, commit, kzgSetting!);
      proofs.add(p);
    }

    blob20Sidecar = BlobTxSidecar(
      blobs: blobs,
      commitments: commitments,
      proofs: proofs,
    );
    setState(() {});
  }
}

解释

  1. 初始化设置

    await DartKzg4844Util.init();
    await loadSetting();
    

    初始化插件并加载设置文件 trusted_setup.json

  2. 生成承诺和证明

    void _generateCommitmentAndProof() async {
      final blobs = <Blob>[];
      final commitments = <KzgCommitment>[];
      final proofs = <KzgProof>[];
    
      blobs.add(Blob.zeroBlob()); // 创建全0的Blob
    
      for (var b in blobs) {
        final commit = await Kzg4844.kzgBlobToCommitment(b, kzgSetting!);
        commitments.add(commit);
        final p = await Kzg4844.kzgComputeBlobKzgProof(b, commit, kzgSetting!);
        proofs.add(p);
      }
    
      sidecar = BlobTxSidecar(
        blobs: blobs,
        commitments: commitments,
        proofs: proofs,
      );
    
      setState(() {});
    }
    
  3. 处理Blob20

    void _blob20CommitmentAndProof() async {
      const mintBlob20 =
          '{"protocol":"blob20","token":{"operation":"mint","ticker":"ETHS","amount":1000}}';
    
      final cborData = cborEncodeApplicationJson(mintBlob20);
      final blobs = cborDataToESIP8Blobs(cborData);
      final commitments = <KzgCommitment>[];
      final proofs = <KzgProof>[];
    
      for (var b in blobs) {
        final commit = await Kzg4844.kzgBlobToCommitment(b, kzgSetting!);
        commitments.add(commit);
        final p = await Kzg4844.kzgComputeBlobKzgProof(b, commit, kzgSetting!);
        proofs.add(p);
      }
    
      blob20Sidecar = BlobTxSidecar(
        blobs: blobs,
        commitments: commitments,
        proofs: proofs,
      );
      setState(() {});
    }

更多关于Flutter插件dart_kzg_4844_util的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件dart_kzg_4844_util的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dart_kzg_4844_util 是一个 Flutter/Dart 插件,主要用于与 KZG(Kate-Zaverucha-Goldberg)承诺方案相关的操作。KZG 承诺方案是一种在零知识证明(ZKP)和区块链技术中广泛使用的多项式承诺方案,特别是在以太坊 2.0 的扩容解决方案中(如 Rollups)有重要应用。

潜在使用场景

  1. 区块链和 Rollups:

    • 以太坊 2.0: KZG 承诺方案用于以太坊 2.0 的数据可用性采样(DAS)和 Rollups(如 Optimistic Rollups 和 ZK-Rollups)中,以确保数据的可用性和完整性。
    • Layer 2 解决方案: 在 Layer 2 扩容解决方案中,KZG 承诺方案用于生成和验证证明,确保链下数据的正确性。
  2. 零知识证明 (ZKP):

    • 隐私保护: KZG 承诺方案可以用于构建零知识证明系统,确保在不泄露原始数据的情况下验证某些属性。
    • 可验证计算: 在可验证计算中,KZG 承诺方案用于验证计算的正确性,而无需重新执行整个计算。
  3. 分布式存储:

    • 数据完整性验证: KZG 承诺方案可以用于分布式存储系统中,确保存储的数据在传输和存储过程中没有被篡改。
  4. 密码学协议:

    • 多方计算 (MPC): KZG 承诺方案可以用于多方计算协议中,确保各方在计算过程中提交的数据是正确和一致的。
    • 门限签名: 在门限签名方案中,KZG 承诺方案可以用于验证签名的正确性。

主要功能

  1. 多项式承诺:

    • 生成承诺: 对多项式生成 KZG 承诺。
    • 验证承诺: 验证给定的承诺是否对应于某个多项式。
  2. 证明生成和验证:

    • 生成证明: 生成证明某个多项式在某个点的值是正确的。
    • 验证证明: 验证给定的证明是否正确。
  3. 批量操作:

    • 批量承诺: 对多个多项式生成批量承诺。
    • 批量验证: 批量验证多个承诺和证明。

示例代码

以下是一个简单的示例,展示如何使用 dart_kzg_4844_util 插件进行多项式承诺和验证:

import 'package:dart_kzg_4844_util/dart_kzg_4844_util.dart';

void main() {
  // 初始化 KZG 上下文
  KZGContext context = KZGContext.init();

  // 定义一个多项式 (例如: f(x) = 3x^2 + 2x + 1)
  List<int> coefficients = [1, 2, 3];

  // 生成多项式承诺
  KZGCommitment commitment = context.commitToPolynomial(coefficients);

  // 生成在某个点的证明 (例如: x = 2)
  int point = 2;
  KZGProof proof = context.createProof(coefficients, point);

  // 验证证明
  bool isValid = context.verifyProof(commitment, proof, point);
  print('Proof is valid: $isValid');
}
回到顶部