开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情
以太坊网络介绍
以太坊网络是一个去中心化的P2P网络,以太坊的主网是一条公链,它允许网络的参与者自由加入或退出以太坊网络,构成去中心化的世界。以太坊上面可以部署智能合约(Smart Contract),智能合约一般使用Solidity语言开发。每一个智能合约都是一个小天地,每一个公民都有自己资产绝对的所有权,没有人可以改变这个事实。比如游戏装备就可以直接卖给其他玩家,游戏的开发者一旦发行出来,就无法控制所生产的游戏装备。
部署单机版本的以太坊私链
我们做去中心化平台开发,一般会先在本地的以太坊私链中测试,毕竟每部署一个智能合约(.sol)文件都需要消耗一定量的Ether,而Ether是需要花钱在市场上购买的,且不便宜。那么,我们怎么部署一个以太坊的节点呢?我们打开trufflesuite.com/ganache/ Truffle Suite网站,下载需要的客户端版本。
由于我的电脑是Mac系统,所以我下载了Mac版本的。
读取以太坊公链的数据
敲黑板,现在我们使用dart语言的Flutter项目访问一下以太坊公链的数据,如果访问自己的本地节点,则用localhost的RPC地址和WebSocket地址。公链中的节点我们随便选一个访问好了,考虑到稳定性,我就采用了imToken的。你们不要都去一窝蜂去访问这个,把它给弄报废了,哈哈。 执行两个命令先下载依赖库。
flutter pub add web3dart
flutter pub add web_socket_channel
这两个库一个是Flutter访问以太坊公链的,另一个是web socket的。
读取以太坊节点的摘要信息
Future<BlockInformation> getBlockInfo() async {
var rpcUrl = 'https://eth-mainnet.token.im';
var wsUrl = 'ws://eth-mainnet.token.im';
var httpClient = Client();
var web3client = Web3Client(rpcUrl, httpClient, socketConnector: () {
return IOWebSocketChannel.connect(wsUrl).cast<String>();
});
return await web3client.getBlockInformation(isContainFullObj: false);
}
BlockInformation中主要也就是时间戳信息。 timestamp:以太坊网络的时间戳,为以太坊的最新区块的生成时间。 baseFeePerGas:基本gas费。 isSupportEIP1559:是否支持EIP1559提案。提案也是体现去中心化的一个要素,以太坊网络的发展方向是由Ether的持有者投票治理的,大概意思就是少数服从多数,而Ether的持有者非常分散。
给别人发起Ether转账
Future<String> sendEther() async {
var rpcUrl = 'https://eth-mainnet.token.im';
var wsUrl = 'ws://eth-mainnet.token.im';
var httpClient = Client();
var web3client = Web3Client(rpcUrl, httpClient, socketConnector: () {
return IOWebSocketChannel.connect(wsUrl).cast<String>();
});
String privateKey = '填入你的私钥';
Credentials credentials = await web3client.setCredentials(privateKey);
return await web3client.sendTransaction(credentials, Transaction(from: credentials.address,
to: EthereumAddress.fromHex('0xcBa852Ef29a43a7542B88F60C999eD9cB66f6000'),
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1)));
}
把你的私钥填进去就可以在以太坊主网发起转账了,导入了私钥它会生成证书,然后可以计算出你的钱包地址。
获取ChainId
Future<BigInt> getChainId() async {
var rpcUrl = 'https://eth-mainnet.token.im';
var wsUrl = 'ws://eth-mainnet.token.im';
var httpClient = Client();
var web3client = Web3Client(rpcUrl, httpClient, socketConnector: () {
return IOWebSocketChannel.connect(wsUrl).cast<String>();
});
return await web3client.getChainId();
}
以太坊的本链的chainId就等于1,当然还有一些以太坊的兼容链,比如BSC某安智能链、Avalanche、Polygon,它们的chainId就不是1,但是可以共用这个私钥和钱包地址。就好比,同样的产品,不同的分销商,以太坊是厂家。
通过交易哈希读取交易信息
Future<TransactionInformation> getTransactionByHash(String transactionHash) async {
var rpcUrl = 'https://eth-mainnet.token.im';
var wsUrl = 'ws://eth-mainnet.token.im';
var httpClient = Client();
var web3client = Web3Client(rpcUrl, httpClient, socketConnector: () {
return IOWebSocketChannel.connect(wsUrl).cast<String>();
});
return await web3client.getTransactionByHash(transactionHash);
}
这里面包含一些与这笔转账相关的信息。
获取钱包余额
Future<EtherAmount> getBalance(EthereumAddress address) async {
var rpcUrl = 'https://eth-mainnet.token.im';
var wsUrl = 'ws://eth-mainnet.token.im';
var httpClient = Client();
var web3client = Web3Client(rpcUrl, httpClient, socketConnector: () {
return IOWebSocketChannel.connect(wsUrl).cast<String>();
});
return await web3client.getBalance(address);
}
这里简单讲解下EthereumAddress,以太坊的钱包地址,它是由42个字符构成,前2个字符一定是0x,后面40个字符是16进制的。Ether的单位你看这个就明白了。
enum EtherUnit {
///Wei, the smallest and atomic amount of Ether
wei,
///kwei, 1000 wei
kwei,
///Mwei, one million wei
mwei,
///Gwei, one billion wei. Typically a reasonable unit to measure gas prices.
gwei,
///szabo, 10^12 wei or 1 μEther
szabo,
///finney, 10^15 wei or 1 mEther
finney,
ether
}
wei是最小的单位,为0.00000000000000001个Ether,注意这个是wei,不是位。
其他还有一些函数我这里就不一一例举了,主要的就这几个。
什么是以太坊的智能合约
智能合约翻译成英语,哦不,本身就是英语,叫Smart Contract。我们知道,任何协议或合同都需要有背书,比如一个国家的货币就是政府给你背书的。房产证也是政府给你背书的,要不然就是一纸空文。在区块链的世界中,谁给你的资产背书,对了,就是程序!所以我们也称为智能的合约。
总结
通过web3dart可以很方便的调用以太坊节点的数据,来构建我们的dApp去中心化应用。这个还只是区块链dApp开发的冰山一角。区块链开发还有Go语言公链开发和Solidity智能合约的开发等。dApp只是一个前端,部署去中心化数据就要使用solidity了。