Flutter Web3交互插件dialect_web3的使用
Flutter Web3交互插件dialect_web3的使用
Protocol & Web3
概要
Dialect 是一个用于 dApp 通知和基于 Solana 区块链的钱包到钱包消息传递的智能消息协议。
目前版本 v0
支持钱包之间的点对点消息传递,这不仅支持 dApp 通知,还支持用户间的聊天。未来版本还将支持一对多和多对多的消息传递。
此存储库包含 Dialect 的 Solana 程序的 Dart 客户端,以 dialect_web3
的形式发布。此存储库不包含 Dialect 的 Rust 程序(协议)。如需了解有关 Dialect 协议的更多信息,包括本地开发说明,请访问我们的 协议 GitHub。
目录
- 使用方法
- 本地开发
- 示例代码
- 消息加密
使用方法
本节将通过展示存储库中 <code>example/</code>
目录中的示例,描述如何在您的应用中使用 Dialect 协议。请按照以下步骤操作,并参考示例代码。
创建第一个 Dialect 并发送和接收消息
example/dialect_web3_example.dart
文件中的示例展示了如何创建一个新的 Dialect,发送和接收消息。
import 'package:dialect_web3/dialect_web3.dart';
import 'package:solana/solana.dart';
final program = // ... 初始化 Dialect 程序
final Ed25519HDKeyPair user1 = await Ed25519HDKeyPair.random();
final Ed25519HDKeyPair user2 = await Ed25519HDKeyPair.random();
// 为用户充值
final List<Member> dialectMembers = [
Member(publicKey: user1.publicKey, scopes: [true, true]),
Member(publicKey: user2.publicKey, scopes: [false, true])
];
final user1Dialect = await createDialect(
client: client,
program: program,
owner: KeypairWallet.fromKeypair(user1),
members: dialectMembers,
encrypted: false); // 为第一个用户创建 Dialect
await sendMessage(client, program, user1Dialect,
KeypairWallet.fromKeypair(user1), "Hello dialect!"); // 发送消息
final dialect = await getDialectForMembers(
client, program, dialectMembers.map((e) => e.publicKey).toList()); // 获取 Dialect
print(dialect.dialect.messages.map((e) => e.text));
// 将打印 "Hello dialect!"
运行上述示例:
dart example/dialect_web3_example.dart
本地开发
使用此 Dialect 客户端与 Solana 的主网和测试网(devnet)一起工作时,无需额外配置即可正常运行。如果您希望使用本地运行的 Dialect 程序进行开发,请按照我们的 协议 GitHub 中的 本地开发 部分进行操作。
消息加密
非对称加密中的 nonce
Nonce
传递给 encrypt()
和 decrypt()
的 24 字节 nonce(一次性数字)绝不能重复用于特定密钥。
重复使用 nonce 意味着攻击者将拥有足够的信息来恢复您的私钥并加密或解密任意消息。nonce 不被视为秘密信息,可以自由传输或以明文形式与密文一起存储。
nonce 不需要是随机生成的,也不需要生成方法保密。例如,nonce 可以是一个递增的计数器,每次加密消息时递增一次。
发送方和接收方都应记录他们已使用的每个 nonce 以及从对方收到的 nonce。他们应拒绝任何重用 nonce 的消息,并绝对确保永远不会重复使用 nonce。仅使用随机值并希望其不会被重复使用是不够的(仅生成随机值会开放系统以受到生日攻击)。
一种好的 nonce 生成方法是,每个人选择唯一的前缀,例如 b"p1" 和 b"p2"。当每个人生成一个 nonce 时,他们会在前面加上该前缀,因此不是 nacl.utils.random(24),而是 b"p1" + nacl.utils.random(22)。此前缀保证了不同人发送的消息不会在传输过程中无意间重叠 nonce。他们仍然应该记录他们自己使用的每个 nonce 和接收到的每个 nonce,以防止重用或重放攻击。
功能、问题报告及进一步帮助
对于功能请求、错误报告或使用此客户端的其他帮助,请随时在我们的 Dialect Discord 服务器 上联系我们。我们将尽可能频繁地更新文档。
示例代码
以下是完整的示例代码,您可以直接复制并在本地运行:
import 'package:dialect_web3/dialect_web3.dart';
import 'package:solana/solana.dart';
void main() async {
final client = RpcClient(programs.localnet.clusterAddress);
final program = await createDialectProgram(
client, Ed25519HDPublicKey.fromBase58(programs.localnet.programAddress));
final Ed25519HDKeyPair user1 = await Ed25519HDKeyPair.random();
final Ed25519HDKeyPair user2 = await Ed25519HDKeyPair.random();
await fundUsers(client: client, keypairs: [user1, user2]); // 为用户充值
final List<Member> dialectMembers = [
Member(publicKey: user1.publicKey, scopes: [true, true]),
Member(publicKey: user2.publicKey, scopes: [false, true])
];
// 为第一个用户创建 Dialect
final user1Dialect = await createDialect(
client: client,
program: program,
owner: KeypairWallet.fromKeypair(user1),
members: dialectMembers,
encrypted: false);
// 发送消息
await sendMessage(client, program, user1Dialect,
KeypairWallet.fromKeypair(user1), "Hello dialect!");
// 获取 Dialect
final dialect = await getDialectForMembers(
client, program, dialectMembers.map((e) => e.publicKey).toList());
print(dialect.dialect.messages.map((e) => e.text));
}
更多关于Flutter Web3交互插件dialect_web3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
dialect_web3
是一个用于在 Flutter 应用中与 Web3 技术进行交互的插件。它提供了一种简单的方式来与以太坊区块链进行交互,包括发送交易、调用智能合约、管理钱包等。
以下是如何在 Flutter 项目中使用 dialect_web3
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 dialect_web3
插件的依赖:
dependencies:
flutter:
sdk: flutter
dialect_web3: ^0.0.1 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入插件
在你的 Dart 文件中导入 dialect_web3
插件:
import 'package:dialect_web3/dialect_web3.dart';
3. 初始化 Web3
在使用 dialect_web3
之前,你需要初始化 Web3 实例。通常你需要一个以太坊节点的 URL(例如 Infura 或 Alchemy 提供的节点)。
final web3 = Web3('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
4. 连接到钱包
你可以使用 dialect_web3
连接到用户的钱包。通常,你可以使用 MetaMask 或其他 Web3 钱包。
final wallet = await web3.connectToWallet();
5. 获取账户地址
一旦连接到钱包,你可以获取用户的账户地址:
final address = await wallet.getAddress();
print('Connected to wallet with address: $address');
6. 发送交易
你可以使用 dialect_web3
发送以太坊交易。以下是一个发送 ETH 的示例:
final transaction = Transaction(
to: '0xRecipientAddress',
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
);
final signedTransaction = await wallet.signTransaction(transaction);
final transactionHash = await web3.sendTransaction(signedTransaction);
print('Transaction sent with hash: $transactionHash');
7. 与智能合约交互
你可以使用 dialect_web3
与智能合约进行交互。首先,你需要智能合约的 ABI 和地址。
final contract = Contract(
address: '0xContractAddress',
abi: jsonAbi, // 你的智能合约的 ABI
web3: web3,
);
final result = await contract.call('functionName', [arg1, arg2]);
print('Function result: $result');
8. 监听事件
你还可以监听智能合约的事件:
final eventSubscription = contract.events.listen((event) {
print('Event received: ${event.event}');
});
9. 断开连接
当你不再需要与钱包交互时,可以断开连接:
await wallet.disconnect();
10. 错误处理
在实际应用中,确保处理可能出现的错误,例如网络错误、用户拒绝连接等。
try {
final wallet = await web3.connectToWallet();
} catch (e) {
print('Error connecting to wallet: $e');
}