最近在研究学习Tendermint , 其实这是一个比较完善的联盟链底层框架了,实现了共识协议、p2p、区块数据存储、交易mempool管理、状态重放、rpc接口这些。开发者只需要写ABCI程序,作为tendermint节点网络的“插件”来处理交易签名校验、交易的业务处理等等。
这里记录一下实践过程中的一些个操作。
tendermint下载:https://github.com/tendermint/tendermint/releases
流程:用curl向tendermint节点26657端口发送转账和查询两个请求,tendermint会通过gRPC调用ABCI程序来进行交易验签、账务处理、账务查询等操作。
简化架构:这里用的是单节点tendermint,实际上应该是最少4节点。另外ABCI没有持久化存储,每次启动跟tendermint节点进行区块数据同步的时候也是返回的默认数据,所以每次启动tendermint节点的时候都需要清空一下tendermint-home目录。但是这些不影响对整体功能的理解。
ABCI程序启动
- mvn compile
- mvn package -DskipTests
- java -jar .\target\tendermint-abci-1.0-SNAPSHOT.jar
复制代码 tendermint节点初始化
- .\tendermint.exe init --home .\tendermint-home\
复制代码 tendermint节点启动:
- .\tendermint.exe node --home .\tendermint-home\ `
- --abci grpc `
- --proxy_app tcp://127.0.0.1:26658
复制代码 密钥对
- === alice ===
- PublicKey: MCowBQYDK2VwAyEAqUGJETBs0UM8N/2dt2jxws7/W16XZG7Z7fmn+vakwgY=
- PrivateKey: MC4CAQAwBQYDK2VwBCIEIN20QL5UtLYUtankHQ1uaTk8mPmOzc47HykL7HbahZ7z
- === bob ===
- PublicKey: MCowBQYDK2VwAyEAafLrCRx28XE/oUMjTTUe3WNyJoRVHOmSVOvYOq33SBo=
- PrivateKey: MC4CAQAwBQYDK2VwBCIEIEsX3Hb77evB6hONZHw0K7kyf3auC3rpI8lGDmUaU+TU
- === carol ===
- PublicKey: MCowBQYDK2VwAyEAUVarvjgIFfokE2v1wn8xetKmW0rcSfsW9p3CZvfshXM=
- PrivateKey: MC4CAQAwBQYDK2VwBCIEIK7yfAc6zj5CsFwRrh1toNglZr5xJIvZl+fNxYQIyt+8
复制代码 模拟客户端请求:
curl "http://localhost:26657/broadcast_tx_commit?tx="{"fromId":"alice","toId":"bob","amount":100}""
curl "http://localhost:26657/abci_query?data="alice""
构造的客户端请求(带签名)
- {"amount":100,"fromId":"alice","signContent":"alice:bob:100","signature":"K5UFXaUAtMAom9Km2zLYEOVLC1O1MDr2XP2BY4N2nO+BK50QfEty8JLugxboZNx3EMeh2m5rBKVA278KKI9TCQ==","toId":"bob"}
复制代码 模拟客户端请求(powershell)
执行转账
- $txBytes = [System.Text.Encoding]::UTF8.GetBytes('{"amount":100,"fromId":"alice","signContent":"alice:bob:100","signature":"K5UFXaUAtMAom9Km2zLYEOVLC1O1MDr2XP2BY4N2nO+BK50QfEty8JLugxboZNx3EMeh2m5rBKVA278KKI9TCQ==","toId":"bob"}')
- $txHex = ($txBytes | ForEach-Object { $_.ToString("x2") }) -join ""
- curl "http://localhost:26657/broadcast_tx_commit?tx=0x$txHex"
复制代码 查询
- $queryBytes = [System.Text.Encoding]::UTF8.GetBytes('alice')
- $queryHex = ($queryBytes | ForEach-Object { $_.ToString("x2") }) -join ""
- curl "http://localhost:26657/abci_query?data=0x$queryHex"
复制代码 执行结果
- StatusCode : 200
- StatusDescription : OK
- Content : {"jsonrpc":"2.0","id":-1,"result":{"response":{"code":0,"log":"balance: 900","info":"","index":"0",
- "key":null,"value":"OTAw","proofOps":null,"height":"0","codespace":""}}}
- RawContent : HTTP/1.1 200 OK
- X-Server-Time: 1774939938
- Content-Length: 171
- Content-Type: application/json
- Date: Tue, 31 Mar 2026 06:52:18 GMT
- {"jsonrpc":"2.0","id":-1,"result":{"response":{"code":0,"log":"b...
- Forms : {}
- Headers : {[X-Server-Time, 1774939938], [Content-Length, 171], [Content-Type, application/json], [Date, Tue,
- 31 Mar 2026 06:52:18 GMT]}
- Images : {}
- InputFields : {}
- Links : {}
- ParsedHtml : System.__ComObject
- RawContentLength : 171
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |