From 613a81ac860d724499400b071c80fb66020f41b8 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Thu, 5 Dec 2024 15:40:16 +0800 Subject: [PATCH 01/15] update get started --- docs/clients/wallet-cli.md | 2 +- .../getting_started_with_javatron.md | 102 ++++++++++-------- 2 files changed, 61 insertions(+), 43 deletions(-) diff --git a/docs/clients/wallet-cli.md b/docs/clients/wallet-cli.md index c635f2304..8b98fd91c 100644 --- a/docs/clients/wallet-cli.md +++ b/docs/clients/wallet-cli.md @@ -1,6 +1,6 @@ # 什么是Wallet-Cli? -Wallet-Cli是一个支持TRON网络的交互式命令行钱包,用于在安全的本地环境中签名和广播交易,也可以获取链上数据。Wallet-Cli支持密钥管理,您可以将私钥导入钱包中,Wallet-Cli会使用对称加密算法加密您的私钥,并存储到一个keystore文件中。Wallet-Cli本地不存储链上数据,它采用gRPC的方式与某一个Java-tron节点进行通信,您需要在配置文件中配置需要链接的Java-tron节点,下图是使用Wallet-Cli签名和广播TRX转账交易的流程: +Wallet-Cli是一个支持TRON网络的交互式命令行钱包,用于在安全的本地环境中签名和广播交易,也可以获取链上数据。Wallet-Cli支持密钥创建和管理,您可以将私钥导入钱包中,Wallet-Cli会使用对称加密算法加密您的私钥,并存储到一个keystore文件中。Wallet-Cli本地不存储链上数据,它采用gRPC的方式与某一个Java-tron节点进行通信,您需要在配置文件中配置需要链接的Java-tron节点,下图是使用Wallet-Cli签名和广播TRX转账交易的流程: ![](https://i.imgur.com/NRKmZmE.png) 用户首先运行`Login`命令解锁钱包,然后运行`SendCoin`命令发送TRX,Wallet-Cli会本地构建和签名交易,然后将调用Java-tron节点的BroadcastTransaction gRPC API将交易广播的网络中,广播成功后Java-tron节点会返回交易hash给Wallet-Cli,Wallet-Cli将交易hash展示给用户。 diff --git a/docs/getting_started/getting_started_with_javatron.md b/docs/getting_started/getting_started_with_javatron.md index 23823304f..c7f383421 100644 --- a/docs/getting_started/getting_started_with_javatron.md +++ b/docs/getting_started/getting_started_with_javatron.md @@ -5,11 +5,11 @@ 本文涵盖了使用Java-tron的基础,这包括生成帐户、加入TRON nile测试网络、在帐户之间发送TRX。文档中也使用了wallet-cli,wallet-cli是TRON网络的一个命令行工具,该工具提供用户交互式命令,使用它可以更方便的与Java-tron进行交互。 -Java-tron是用Java编写的TRON网络客户端,这意味着运行Java-tron的计算机会变成一个TRON网络节点。TRON网络是一个分布式网络,信息在节点之间共享,而不是由中央服务器管理。超级代表的节点在生成新的区块后,会将区块发送给其它节点。每个节点在接收到一个新的区块时,都会对其进行校验,校验通过后将其添加到自己的数据库中。Java-tron使用每个区块提供的信息来更新其“状态”——TRON网络上每个账户的余额。TRON网络上有两种类型的帐户:外部拥有的帐户和合约帐户。合约帐户在收到交易时执行合约代码。外部账户是用户在本地管理的帐户,以便签署和提交交易。每个外部账户都是一个公私密钥对,其中公钥用于为用户派生一个唯一的地址,而私钥用于保护帐户和安全签署消息。因此,为了使用TRON网络,首先需要生成外部账户(以下简称“帐户”)。本教程将指导用户如何创建一个帐户,存入TRX代币,并转账TRX。 +Java-tron是用Java编写的TRON网络客户端,这意味着运行Java-tron的计算机会变成一个TRON网络节点。TRON网络是一个分布式网络,信息在节点之间共享,而不是由中央服务器管理。超级代表的节点在生成新的区块后,会将区块发送给其它节点。每个节点在接收到一个新的区块时,都会对其进行校验,校验通过后将其添加到自己的数据库中。Java-tron使用每个区块提供的信息来更新其“状态”——TRON网络上每个账户的余额。TRON网络上有两种类型的帐户:外部拥有的帐户和合约帐户。合约帐户在收到交易时执行合约代码。外部账户是用户在本地管理的帐户,以便签署和提交交易,比如通过TronLink钱包创建的账户。每个外部账户都是一个公私密钥对,其中公钥用于为用户派生一个唯一的地址,而私钥用于保护帐户和安全签署消息。因此,为了使用TRON网络,首先需要生成外部账户(以下简称“帐户”)。本教程将指导用户如何创建一个帐户,存入TRX代币,并转账TRX。 # 生成账户 -有多种方法来生成TRON网络帐户,这里将演示如何使用wallet-cli生成帐户。帐户是一对密钥(公钥和私钥)。 +有多种方法来生成TRON网络帐户,这里将演示如何使用wallet-cli生成帐户, 参考[安装和部署](../clients/wallet-cli.md)章节。帐户是一对密钥(公钥和私钥)。 在终端中通过命令`java -jar wallet-cli.jar`来启动一个wallet-cli: ``` @@ -18,23 +18,23 @@ $ java -jar wallet-cli.jar Welcome to Tron Wallet-Cli Please type one of the following commands to proceed. Login, RegisterWallet or ImportWallet - + You may also use the Help command at anytime to display a full list of commands. - -wallet> + +wallet> ``` 输入命令:registerwallet,然后根据提示输入密码。该命令会生成TRON网络账户,并注册到wallet-cli,也就是wallet-cli会保存此账户的私钥,之后就可以使用该私钥对交易进行签名了。 ``` wallet> registerwallet Please input password. -password: +password: user defined config file doesn't exists, use default config file in jar WalletApi getRpcVsersion: 2 Please input password again. -password: +password: Register a wallet successful, keystore file name is UTC--2022-07-04T06-35-35.304000000Z--TQXjm2J8K2DKTV49MdfT2anjUehbU3WDJz.json -wallet> +wallet> ``` # 登录wallet-cli @@ -49,9 +49,9 @@ wallet> login Please choose between 1 and 3 2 Please input your password. -password: +password: Login successful !!! -wallet> +wallet> ``` 登录后,可以通过getaddress命令查看登录的账户地址: @@ -59,7 +59,7 @@ wallet> wallet> getaddress GetAddress successful !! address = TQXjm2J8K2DKTV49MdfT2anjUehbU3WDJz -wallet> +wallet> ``` 然后可以通过backupwallet命令,根据提示输入密码后,查看账户的私钥,建议保存好私钥。 @@ -92,14 +92,14 @@ Java-tron启动后,日志将包括以下内容: 11:08:42.567 INFO [TronJClientWorker-1] [DB](Manager.java:1642) solidBlockNumber:23113849 11:08:42.567 INFO [TronJClientWorker-1] [net](SyncService.java:179) Get block chain summary, low: 23113867, highNoFork: 23113867, high: 23113867, realHigh: 23113867 11:08:42.572 INFO [TronJClientWorker-1] [net](MessageQueue.java:106) Send to /123.56.3.74:18888, type: SYNC_BLOCK_CHAIN -size: 1, start block: Num:23113867,ID:000000000160b08b510b6c501c980a2567bff1229eed62ca79874c9ca7828e9c +size: 1, start block: Num:23113867,ID:000000000160b08b510b6c501c980a2567bff1229eed62ca79874c9ca7828e9c 11:08:42.631 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK_CHAIN_INVENTORY size: 2001, first blockId: Num:23113867,ID:000000000160b08b510b6c501c980a2567bff1229eed62ca79874c9ca7828e9c, end blockId: Num:23115867,ID:000000000160b85b587ef18d00a1905d8022ec0a8fd174f3980b78f6aacf0ede ...... 11:08:43.478 INFO [pool-49-thread-1] [net](MessageQueue.java:106) Send to /123.56.3.74:18888, type: FETCH_INV_DATA -invType: BLOCK, size: 100, First hash: 000000000160b08c6eeba60eced4fb13d7c56e46a3c5220a67bb2801a05e5679, End hash: 000000000160b0efd90560e389d1f6e5b3c8d3877709ce375a8e063f5db73af9 +invType: BLOCK, size: 100, First hash: 000000000160b08c6eeba60eced4fb13d7c56e46a3c5220a67bb2801a05e5679, End hash: 000000000160b0efd90560e389d1f6e5b3c8d3877709ce375a8e063f5db73af9 11:08:43.502 INFO [TronJClientWorker-1] [net](MessageQueue.java:121) Receive from /123.56.3.74:18888, type: BLOCK Num:23113868,ID:000000000160b08c6eeba60eced4fb13d7c56e46a3c5220a67bb2801a05e5679, trx size: 1 @@ -119,14 +119,16 @@ $ curl http://127.0.0.1:16887/wallet/getnodeinfo 如果要关闭Java-tron,请通过`kill -15 进程id`来暂停节点。 # 获取Nile测试网TRX -为了能够发送交易,用户的账户中需要持有TRX。在TRON网络主网上,只能通过三种方式获得TRX: -1. 超级代表生产区块/为超级代表投票的奖励; -2. 另一个TRON网络账户向其转账TRX; +为了能够发送交易,用户的账户中需要持有TRX。在TRON网络主网上,只能通过三种方式获得TRX: +1. 超级代表生产区块/为超级代表投票的奖励; +2. 另一个TRON网络账户向其转账TRX; 3. 从交易所获得。 在TRON测试网中,TRX没有实际价值, 可以通过 [水龙头](https://nileex.io/join/getJoinPage) 免费获得。 # 与Java-tron交互 +如果本地不便运行节点,或者节点要长时间同步数据才能获取最新的数据,可以使用TronGrid。TronGrid提供负载均衡的,安全的,可靠的的节点访问API,参考[TronGrid](../clients/tron-grid.md)。 +Nile测试网的TronGrid地址为 https://nile.trongrid.io。其他网络节点或者grpc连接参考[Networks](https://developers.tron.network/docs/networks)。 ## 使用wallet-cli与Java-tron节点进行交互 Java-tron对外提供http接口和grpc接口,方便用户与TRON网络进行交互。wallet-cli使用的是grpc接口。 @@ -148,7 +150,7 @@ wallet> getaccount TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM "account_resource": { "latest_consume_time_for_energy": 1655358327000 }, - + ...... } @@ -158,7 +160,7 @@ wallet> getaccount TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM ``` wallet> getbalance Balance = 93642857919 -wallet> +wallet> ``` ### 转账TRX @@ -202,11 +204,11 @@ The 3th keystore file name is UTC--2022-06-21T09-51-26.367000000Z--TUoHaVjx7n5xz Please choose between 1 and 3 3 Please input your password. -password: +password: after sign transaction hex string is 0a85010a02cbc322088581ae7e29258a5240dbfc91ca9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c301241241a3ce4797ccc2fedf49ae41af28b49df1e15a476e4948af4df5aadf23a1e940ad5cc2133f501c08f2bab6a2231cdc82a745fed0fc6a012dc19310532d9138600 txid is 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adcd464ea155a4 Send 1000000 Sun to TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf successful !! -wallet> +wallet> ``` ### 根据交易id查询交易 @@ -245,7 +247,7 @@ wallet> gettransactionbyid 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca145adc }, "raw_data_hex":"0a02cbc322088581ae7e29258a5240dbfc91ca9c305a67080112630a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412320a1541ce8a0cf0c16d48bcf22825f6053248df653c89ca121541d0b69631440f0a494bb51f7eee68ff5c593c00f018c0843d7098cfebbf9c30" } -wallet> +wallet> ``` @@ -262,26 +264,41 @@ wallet> gettransactioninfobyid 21851bcf1faf22c99a7a49c4f246d709cf9f54db2f264ca14 "net_usage": 267 } } -wallet> +wallet> ``` ## 使用Curl与Java-tron节点进行交互 -上文介绍了如何使用wallet-cli与Java-tron进行交互。与直接发送grpc/http命令相比,该工具提供更友好的交互式命令,使用户可以更方便的向Java-tron发送指令。但是,如何直接发送HTTP请求到Java-tron节点呢? Curl是一个发送HTTP请求的命令行工具。本章节将说明如何通过Curl检查帐户余额,并发送交易。 +上文介绍了如何使用wallet-cli与Java-tron进行交互。与直接发送grpc/http命令相比,该工具提供更友好的交互式命令,使用户可以更方便的向Java-tron发送指令。但是,如何直接发送HTTP请求到Java-tron节点呢? Curl是一个发送HTTP请求的命令行工具, 可以把curl命令复制到Postman工具里使用。本章节将说明如何通过Curl检查帐户余额,并发送交易。如果本地节点无法访问,请使用TranGrid API. ### 查询账户余额 -可以通过节点HTTP接口`wallet/getaccount`来查询账户的TRX余额信息,返回结果中的balance即为TRX余额,以sun为单位: +可以通过节点HTTP接口`wallet/getaccount`来查询账户的TRX余额信息,返回结果中的balance即为TRX余额,以sun为单位。 + +访问本地节点,注意本地节点如果同步中则可能数据不准确: ``` - curl -X POST http://127.0.0.1:16887/wallet/getaccount -d - '{"address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", - "visible": true - }' +curl --location 'http://127.0.0.1:16887/wallet/getaccount' \ +--header 'Content-Type: application/json' \ +--data '{ + "address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", + "visible": true +}' ``` -结果为: +参考返回结果数据: ``` {"account_name": "testacc2","address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM","balance": 1000000000000000,"account_resource": {}} ``` +也可以通过TranGrid访问其他远端节点: +``` + curl --location 'https://nile.trongrid.io/wallet/getaccount' \ +--header 'Content-Type: application/json' \ +--data '{ + "address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", + "visible":"true" +}' +``` + + ### 发送交易 通过http接口发送交易,总共需要三步: @@ -293,13 +310,14 @@ wallet> 通过fullnode HTTP接口`wallet/createtransaction`创建一个未签名的TRX转账交易: ``` -curl -X POST http://127.0.0.1:16887/wallet/createtransaction -d - '{ - "to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf", - "owner_address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", - "amount": 10000000, - "visible":true - }' +curl --location 'http://127.0.0.1:16887/wallet/createtransaction' \ +--header 'Content-Type: application/json' \ +--data '{ + "to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf", + "owner_address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", + "amount": 10000000, + "visible":true +}' ``` 返回一个未签名的TRX转账交易: ``` @@ -312,7 +330,7 @@ curl -X POST http://127.0.0.1:16887/wallet/createtransaction -d "parameter": { "value": { "amount": 10000000, - "owner_address": "TPswDDCAWhJAZGdHPidFg5nEf8TkNToDX1", + "owner_address": "TUoHaVjx7n5xz8LwPRDckgFrDWhMhuSuJM", "to_address": "TUznHJfHe6gdYY7gvWmf6bNZHuPHDZtowf" }, "type_url": "type.googleapis.com/protocol.TransferContract" @@ -376,14 +394,14 @@ curl --location --request POST 'http://127.0.0.1:16887/wallet/broadcasttransacti ### 根据交易id查询交易 通过http接口 `wallet/gettransactionbyid`来查询交易的内容: ``` -curl --location --request POST 'http://127.0.0.1:16887/wallet/gettransactionbyid' \ +curl --location 'http://127.0.0.1:16887/wallet/gettransactionbyid' \ --header 'Content-Type: application/json' \ ---data-raw '{ - "value": "c558bd35978267d8999baf6148703cbc94786f3f2e22893637588ca05437d7f0" +--data '{ + "value": "f51f427344460ea484e92a90dc8701a4bbdb57f8b29ce1d7a7dca1bd74a5e1f2", + "visible": true }' ``` -查询结果为: - +参考查询结果为: ``` { "ret": [ From 54d28793cfa77ec297a5bf0e00cd3bbe2d256552 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Thu, 5 Dec 2024 16:53:46 +0800 Subject: [PATCH 02/15] update installing javatron --- docs/using_javatron/installing_javatron.md | 34 ++++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/using_javatron/installing_javatron.md b/docs/using_javatron/installing_javatron.md index 094afdd3c..23bf3582b 100644 --- a/docs/using_javatron/installing_javatron.md +++ b/docs/using_javatron/installing_javatron.md @@ -31,24 +31,40 @@ Fullnode作为TRON网络的入口点,拥有完整的历史数据,并提供 ```` $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c main_net_config.conf ```` - + * -XX:+UseConcMarkSweepGC :指定并行垃圾回收。要放在 -jar 参数前面,不能放在最后面。 -* -Xmx :JVM堆的最大值,可以设置成物理内存的80%。 +* -Xmx :JVM堆所占内存的最大值,可以设置成物理内存的80%。 + +Java-tron启动后,日志会输出在文件java-tron/logs/tron.log中,查看文件可以看到以下内容显示网络层建立P2P连接,之后节点开始区块同步: +``` +16:41:11.229 INFO [main] [app](Args.java:1143) ************************ Net config ************************ +16:41:11.229 INFO [main] [app](Args.java:1144) P2P version: 201910292 +16:41:11.229 INFO [main] [app](Args.java:1145) Bind IP: 192.168.20.101 +16:41:11.229 INFO [main] [app](Args.java:1146) External IP: 203.12.203.3 +16:41:11.229 INFO [main] [app](Args.java:1147) Listen port: 18888 +16:41:11.229 INFO [main] [app](Args.java:1148) Discover enable: true +... ... +16:41:32.838 INFO [peerClient-13] [DB](Manager.java:1936) HeadNumber: 52347923, syncBeginNumber: 52347923, solidBlockNumber: 52347905. +16:41:32.839 INFO [peerClient-13] [net](SyncService.java:197) Get block chain summary, low: 52347923, highNoFork: 52347923, high: 52347923, realHigh: 52347923 +16:41:32.839 INFO [peerClient-13] [net](PeerConnection.java:184) Send peer /82.200.155.164:18888 message type: SYNC_BLOCK_CHAIN +size: 1, start block: Num:52347923,ID:00000000031ec413b7d75adeb141cfb6acf01127436dcd02eafbaf58df07f9e5 +``` +如果节点启动异常,该日志也会输出错误信息。 ### 启动出块的全节点 将`--witness`参数添加到启动命令中,fullnode将作为出块的全节点运行。出块全节点除了支持fullnode的所有功能,它还支持区块生产和交易打包。请确保您拥有一个超级代表账户,并获得他人的投票,如果票数排在前27名,您需要启动一个出块的全节点参与区块生产。 - -将超级代表地址的私钥填写到main_net_config.conf的localwitness列表中,示例如下。但如果不希望使用这种以明文的方式进行私钥指定,可以使用keystore + 密码的方式,请参考[其它说明](#_2) + +将超级代表地址的私钥填写到main_net_config.conf的localwitness列表中,示例如下。但如果不希望使用这种以明文的方式进行私钥指定,可以使用keystore + 密码的方式,请参考下面[其它说明](#_3)。 ``` localwitness = [ 650950B193DDDDB35B6E48912DD28F7AB0E7140C1BFDEFD493348F02295BD812 ] ``` - + 然后执行如下命令来启动节点: - + ``` $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar --witness -c main_net_config.conf ``` @@ -80,10 +96,10 @@ $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar --witness -c main_net_c 安装tcmalloc,然后在启动脚本中添加以下两行,不同的linux发行版tcmalloc的路径略有差异。 ``` #!/bin/bash - + export LD_PRELOAD="/usr/lib/libtcmalloc.so.4" export TCMALLOC_RELEASE_RATE=10 - + # original start command java -jar ..... ``` @@ -121,4 +137,4 @@ java -jar ..... ``` export LD_PRELOAD="/usr/lib64/libtcmalloc.so.4" export TCMALLOC_RELEASE_RATE=10 - ``` \ No newline at end of file + ``` From b859a119e3d0a4233f95f99a6a4a74780ec19838 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Fri, 6 Dec 2024 17:01:22 +0800 Subject: [PATCH 03/15] update using javatron --- docs/using_javatron/backup_restore.md | 1 + docs/using_javatron/installing_javatron.md | 2 +- docs/using_javatron/private_network.md | 47 +++++++++++++++------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/docs/using_javatron/backup_restore.md b/docs/using_javatron/backup_restore.md index 14b6c4a1b..e4faf7b44 100644 --- a/docs/using_javatron/backup_restore.md +++ b/docs/using_javatron/backup_restore.md @@ -58,6 +58,7 @@ $ tar xzvf output-directory.20220628152402.etgz 注意:LevelDB和RocksDB的数据不允许混用。FullNode的数据库类型通过配置文件的配置项`db.engine` 进行指定,可选值为`LEVELDB`或者`ROCKSDB`。 +Nile测试网数据下载地址:https://database.nileex.io ### Lite FullNode数据快照 diff --git a/docs/using_javatron/installing_javatron.md b/docs/using_javatron/installing_javatron.md index 23bf3582b..327d02696 100644 --- a/docs/using_javatron/installing_javatron.md +++ b/docs/using_javatron/installing_javatron.md @@ -69,7 +69,7 @@ localwitness = [ $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar --witness -c main_net_config.conf ``` -**注意**:对于主网和nile测试网,由于新节点启动后,需要同步的数据量较大,因此同步数据需要较长的时间。可以使用 [数据快照](../backup_restore/#_5) 来加快节点同步速度。首先下载最新的数据快照,并将其解压至tron项目的output-directory目录下,然后再启动节点,这样节点将在数据快照的基础上进行同步。 +**注意**:对于主网和nile测试网,由于新节点启动后,需要同步的数据量较大,因此同步数据需要较长的时间。可以使用 [数据快照](../backup_restore/#_5) 来加快节点同步速度,Nile测试网[下载](https://database.nileex.io)。首先下载最新的数据快照,并将其解压至tron项目的output-directory目录下,然后再启动节点,这样节点将在数据快照的基础上进行同步。 # 其它说明 ### 如何使用keystore+密码的方式指定witness账户私钥 diff --git a/docs/using_javatron/private_network.md b/docs/using_javatron/private_network.md index de6142efa..647a35981 100644 --- a/docs/using_javatron/private_network.md +++ b/docs/using_javatron/private_network.md @@ -31,29 +31,46 @@ ``` 4. 修改各节点的配置文件 - + 请根据如下表格中的说明,依次修改节点的各个配置项: - | 配置项名称 | SR Fullnode配置内容 | FullNode配置内容 | 说明 | - | :-------- | :-------- | :-------- | :-------- | - | localwitness | witness账户私钥 | 不需填值 | 生成区块需要使用私钥签名 | - | genesis.block.witnesses | 上面私钥对应的地址 | 与SR配置值相同 | 创世块相关的配置,genesis.block需要与SR节点的一样 | - | genesis.block.Assets | 给特定账户预置TRX。将预先准备的账户地址写入并随意指定其TRX的余额。可以直接修改原来已有账户的address字段,其它字段不需要修改;或者在末尾添加新账户信息 | 与SR配置值相同 | 创世块相关的配置 | - | p2p.version | 11111之外的任意正整数 | 与SR配置值相同 | SR 和fullnode需相同,只有相同version的节点才能握手成功 | - | seed.node | 不需填值 | 将ip.list设置为SR的ip地址和SR配置文件中的`listen.port`端口号 | 能够让fullnode与SR node建立连接并同步数据 | - | needSyncCheck | false | true | 第1个SR设置needSyncCheck为false,其他设置为true | - | node.discovery.enable | true | true | 如果配置成false,则当前节点不会被其他节点发现 | - |block.proposalExpireTime|600000 |与SR配置值相同 |默认提议生效时间是3天:259200000(ms),如需快速通过提议,可将该项设置为更小的值,如10分钟,即600000ms| - |block.maintenanceTimeInterval|300000| 与SR配置值相同 | 维护期时间间隔,默认是6小时: 21600000(ms),如需快速通过提议,可将该项设置为更小的值,如五分钟,即300000ms。| - |committee.allowSameTokenName |1|1|允许相同的token name| - |committee.allowTvmTransferTrc10 | 1|1|允许智能合约转账TRC10代币| + | 配置项名称 | SR Fullnode配置内容 | FullNode配置内容 | 说明 | + | :-------- |:-------------------------------------------------------------------------------------| :-------- | :-------- | + | localwitness | witness账户私钥 | 不需填值 | 生成区块需要使用私钥签名 | + | genesis.block.witnesses | 上面私钥对应的地址 | 与SR配置值相同 | 创世块相关的配置,genesis.block需要与SR节点的一样 | + | genesis.block.Assets | 给特定账户预置TRX。
将预先准备的账户地址写入并随意指定其TRX的余额。
可以直接修改原来已有账户的address字段,其它字段不需要修改;或者在末尾添加新账户信息 | 与SR配置值相同 | 创世块相关的配置 | + | p2p.version | 11111之外的任意正整数 | 与SR配置值相同 | SR 和fullnode需相同,只有相同version的节点才能握手成功 | + | seed.node | 不需填值 | 将ip.list设置为SR的ip地址和SR配置文件中的`listen.port`端口号 | 能够让fullnode与SR node建立连接并同步数据 | + | needSyncCheck | false | true | 第1个SR设置needSyncCheck为false,其他设置为true | + | node.discovery.enable | true | true | 如果配置成false,则当前节点不会被其他节点发现 | + |block.proposalExpireTime| 600000 |与SR配置值相同 |默认提议生效时间是3天:259200000(ms),如需快速通过提议,可将该项设置为更小的值,如10分钟,即600000ms| + |block.maintenanceTimeInterval| 300000 | 与SR配置值相同 | 维护期时间间隔,默认是6小时: 21600000(ms),如需快速通过提议,可将该项设置为更小的值,如五分钟,即300000ms。| + |committee.allowSameTokenName | 1 |1|允许相同的token name| + |committee.allowTvmTransferTrc10 | 1 |1|允许智能合约转账TRC10代币| + - 5. 修改配置文件中的端口号,将SR和FullNode的配置成不相同的端口号。注意,如果SR和FullNode运行在一台机器上,此步骤是必须的,否则,可跳过此步。 + 在配置文件的node结构下面修改下列参数: * `listen.port` : p2p的监听端口 * `http`端口: Http监听端口 * `rpc` 端口: rpc 监听端口 +``` +node { + listen.port = 16666 + + http { + fullNodePort = 16667 + solidityPort = 16668 + } + + rpc { + port = 16669 + ... + } + ... + } +``` 6. 启动节点 产块的全节点和非产块的全节点,启动命令不同: From 84411d61aaff30ed9f217fce560a3c96fb8fdb15 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Fri, 6 Dec 2024 17:27:20 +0800 Subject: [PATCH 04/15] update --- docs/using_javatron/private_network.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/using_javatron/private_network.md b/docs/using_javatron/private_network.md index 647a35981..4d3287cae 100644 --- a/docs/using_javatron/private_network.md +++ b/docs/using_javatron/private_network.md @@ -32,7 +32,7 @@ 4. 修改各节点的配置文件 - 请根据如下表格中的说明,依次修改节点的各个配置项: + 请根据如下表格中的说明,依次修改节点的各个配置项,**滑动向右**查看不同节点配置: | 配置项名称 | SR Fullnode配置内容 | FullNode配置内容 | 说明 | | :-------- |:-------------------------------------------------------------------------------------| :-------- | :-------- | @@ -131,4 +131,4 @@ node { modifyChainParameters(parametersForProposal2, 2) ``` - 等待该提议生效后,私链的动态参数与主网就一致了,您可以通过/wallet/getchainparameters接口查询链参数。 \ No newline at end of file + 等待该提议生效后,私链的动态参数与主网就一致了,您可以通过/wallet/getchainparameters接口查询链参数。 From 75ddb0a3449b04c4681a1e1323c6865640211ec4 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Tue, 10 Dec 2024 10:51:49 +0800 Subject: [PATCH 05/15] update events --- docs/architecture/event.md | 2 +- docs/using_javatron/installing_javatron.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/architecture/event.md b/docs/architecture/event.md index d33a202bf..4b3582c06 100644 --- a/docs/architecture/event.md +++ b/docs/architecture/event.md @@ -7,7 +7,7 @@ TIP: [https://github.com/tronprotocol/TIPs/issues/12](https://github.com/tronprotocol/TIPs/issues/12) ### 事件类型 -波场事件订阅支持四种类型的事件: +波场事件订阅支持四种类型的事件,注意这些事件是当交易被打包进区块后才对外发送的: - 交易相关事件 diff --git a/docs/using_javatron/installing_javatron.md b/docs/using_javatron/installing_javatron.md index 327d02696..2fa9f68d3 100644 --- a/docs/using_javatron/installing_javatron.md +++ b/docs/using_javatron/installing_javatron.md @@ -12,13 +12,13 @@ $ git checkout -t origin/master ``` 然后,通过执行如下命令编译Java-tron源代码。参数`-x test`表示跳过执行测试用例,您也可以去掉这个参数,以在编译的过程中执行测试代码,这将使编译时间更长。编译完成之后,FullNode.jar会生成在 `java-tron/build/libs/`目录下。 - + ``` $ cd java-tron $ ./gradlew clean build -x test ``` - - + + # 运行Java-tron节点 @@ -46,7 +46,7 @@ Java-tron启动后,日志会输出在文件java-tron/logs/tron.log中,查看 ... ... 16:41:32.838 INFO [peerClient-13] [DB](Manager.java:1936) HeadNumber: 52347923, syncBeginNumber: 52347923, solidBlockNumber: 52347905. 16:41:32.839 INFO [peerClient-13] [net](SyncService.java:197) Get block chain summary, low: 52347923, highNoFork: 52347923, high: 52347923, realHigh: 52347923 -16:41:32.839 INFO [peerClient-13] [net](PeerConnection.java:184) Send peer /82.200.155.164:18888 message type: SYNC_BLOCK_CHAIN +16:41:32.839 INFO [peerClient-13] [net](PeerConnection.java:184) Send peer /182.125.127.201:18888 message type: SYNC_BLOCK_CHAIN size: 1, start block: Num:52347923,ID:00000000031ec413b7d75adeb141cfb6acf01127436dcd02eafbaf58df07f9e5 ``` 如果节点启动异常,该日志也会输出错误信息。 From 990564a411e1cd8152d9cb53a1d889f524a8d847 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Tue, 10 Dec 2024 13:34:05 +0800 Subject: [PATCH 06/15] update using-javatron --- docs/architecture/event.md | 2 +- docs/using_javatron/installing_javatron.md | 2 ++ docs/using_javatron/metrics.md | 2 +- docs/using_javatron/toolkit.md | 13 +++++++++---- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/architecture/event.md b/docs/architecture/event.md index 4b3582c06..bf3f32588 100644 --- a/docs/architecture/event.md +++ b/docs/architecture/event.md @@ -7,7 +7,7 @@ TIP: [https://github.com/tronprotocol/TIPs/issues/12](https://github.com/tronprotocol/TIPs/issues/12) ### 事件类型 -波场事件订阅支持四种类型的事件,注意这些事件是当交易被打包进区块后才对外发送的: +当交易被打包进区块后,波场会对外发送四种类型的事件: - 交易相关事件 diff --git a/docs/using_javatron/installing_javatron.md b/docs/using_javatron/installing_javatron.md index 2fa9f68d3..b9d29231f 100644 --- a/docs/using_javatron/installing_javatron.md +++ b/docs/using_javatron/installing_javatron.md @@ -35,6 +35,8 @@ $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c main_net_config.con * -XX:+UseConcMarkSweepGC :指定并行垃圾回收。要放在 -jar 参数前面,不能放在最后面。 * -Xmx :JVM堆所占内存的最大值,可以设置成物理内存的80%。 +main_net_config.conf里面的部分配置参考[网络配置](./connecting_to_tron.md)章节。 + Java-tron启动后,日志会输出在文件java-tron/logs/tron.log中,查看文件可以看到以下内容显示网络层建立P2P连接,之后节点开始区块同步: ``` 16:41:11.229 INFO [main] [app](Args.java:1143) ************************ Net config ************************ diff --git a/docs/using_javatron/metrics.md b/docs/using_javatron/metrics.md index 4a7152908..ecb43f9a8 100644 --- a/docs/using_javatron/metrics.md +++ b/docs/using_javatron/metrics.md @@ -21,7 +21,7 @@ node { ``` ## 启动Java-tron节点 -您可以通过如下命令启动Java-tron节点: +您可以通过如下命令启动Java-tron节点, 参考[部署Java-tron](./installing_javatron.md)章节。 ``` $ java -Xmx24g -XX:+UseConcMarkSweepGC -jar FullNode.jar -c main_net_config.conf ``` diff --git a/docs/using_javatron/toolkit.md b/docs/using_javatron/toolkit.md index d42c6fbe2..a9a2c34dc 100644 --- a/docs/using_javatron/toolkit.md +++ b/docs/using_javatron/toolkit.md @@ -131,12 +131,17 @@ Toolkit提供数据剪裁工具,主要用于轻节点数据的生成以及轻 数据剪裁工具根据当前`最新区块高度`(latest_block_number)可将完整数据切分成快照数据集(Snapshot dataset)或历史数据集(History dataset),快照数据集用于启动轻节点,历史数据集用于历史数据查询。通过快照数据集启动的轻节点不支持查询剪裁时的最新区块高度之前的历史数据。数据剪裁工具还提供了将历史数据集同快照数据集合并的功能,使用场景如下: * 将全节点数据切分成轻节点数据 - 轻节点只基于快照数据集启动,使用数据剪裁工具将全节点数据切分成快照数据集,即得到轻节点数据 + +轻节点只基于快照数据集启动,使用数据剪裁工具将全节点数据切分成快照数据集,即得到轻节点数据。 + * 定期剪裁轻节点数据 - 由于轻节点启动后,会保存与全节点同样的数据,所以轻节点虽然在启动时数据量非常小,但是后期的数据膨胀速度与全节点相同,因此可能需要定期剪裁数据。裁剪轻节点数据也是使用数据剪裁工具将轻节点数据切分成快照数据集,即得到裁剪后的轻节点数据 + +由于轻节点启动后,会保存与全节点同样的数据,所以轻节点虽然在启动时数据量非常小,但是后期的数据膨胀速度与全节点相同,因此可能需要定期剪裁数据。裁剪轻节点数据也是使用数据剪裁工具将轻节点数据切分成快照数据集,即得到裁剪后的轻节点数据。 + * 将轻节点数据转回全节点数据 - 由于轻节点不支持历史数据查询,如果要支持,则需要将轻节点数据变为全节点数据,那么该节点也就从轻节点变成了全节点。可以直接下载全节点数据库快照实现,也可以使用数据剪裁工具:首先将全节点数据切分成历史数据集,再合并历史数据集与轻节点的快照数据集,得到全节点数据。 - + +由于轻节点不支持历史数据查询,如果要支持,则需要将轻节点数据变为全节点数据,那么该节点也就从轻节点变成了全节点。可以直接下载全节点数据库快照实现,也可以使用数据剪裁工具:首先将全节点数据切分成历史数据集,再合并历史数据集与轻节点的快照数据集,得到全节点数据。 + 注意:使用本工具进行任何操作之前,需要首先停止当前运行的节点。 From 431c32dab508d725ca0852a617fb4e1d7fd2964a Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Tue, 10 Dec 2024 17:14:34 +0800 Subject: [PATCH 07/15] update http.md --- docs/api/http.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/api/http.md b/docs/api/http.md index 457c56704..3fc329ae5 100644 --- a/docs/api/http.md +++ b/docs/api/http.md @@ -8,7 +8,10 @@ 请务必为来自 API 的所有数据实施 XSS 防护,以确保用户数据的安全。我们了解您可能需要有关 XSS 防护的更多信息。建议您参考以下资源:[OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html)。 -首先,对HTTP API中地址格式的选择进行说明:TRON网络账户地址格式有两种:HexString格式和Base58格式。节点HTTP API支持地址格式选择,用户可以通过visible参数设置地址格式,默认值为false,参数及返回值中的地址格式均为hex格式,当visible设置为true时,参数及返回值中的地址格式均为Base58格式。如果参数格式与visible设置不匹配,将会报错。设置方式: +首先,对HTTP API中地址格式的选择进行说明:TRON网络账户地址格式有两种:HexString格式和Base58格式。 +像TronLink钱包地址`TUXAoxQ8PwFAtfQet7Akc8HaV5ciC6WkjY`就是Base58格式。可以使用[TranScan](https://nile.tronscan.org/#/tools/code-converter/base58check)工具方便格式之间的转换。 + +节点HTTP API支持地址格式选择,用户可以通过visible参数设置地址格式,默认值为false,参数及返回值中的地址格式均为hex格式,当visible设置为true时,参数及返回值中的地址格式均为Base58格式。如果参数格式与visible设置不匹配,将会报错。设置方式: - 对于GET方式请求接口或者不需要参数的查询接口,通过在url中增加参数`visible=true` ```text @@ -16,8 +19,9 @@ http://127.0.0.1:8090/wallet/listexchanges?visible=true ``` - 对于POST方式请求接口,通过在json结构体最外层中增加参数`"visible": true` ```json -curl -X POST http://127.0.0.1:8090/wallet/createtransaction -d -'{ +curl --location 'http://127.0.0.1:8090/wallet/createtransaction' \ +--header 'Content-Type: application/json' \ +--data '{ "owner_address": "TRGhNNfnmgLegT4zHNjEqDSADjgmnHvubJ", "to_address": "TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW", "amount": 1000000, @@ -63,16 +67,29 @@ FullNode HTTP API分类如下: #### wallet/validateaddress 作用:检查地址是否正确 ``` -curl -X POST http://127.0.0.1:8090/wallet/validateaddress -d '{"address": "4189139CB1387AF85E3D24E212A008AC974967E561"}' +curl -X POST http://127.0.0.1:8090/wallet/validateaddress +--header 'Content-Type: application/json' +-d '{"address": "4189139CB1387AF85E3D24E212A008AC974967E561"}' ``` 参数说明:地址,可以是base58checksum、hexString、base64格式 返回值:地址正确或者错误 +``` +{ + "result": true, + "message": "Hex string format" +} +``` #### wallet/createaccount 作用:创建账号,一个已经激活的账号创建一个新账号。如果创建者账号有足够的通过质押TRX获得的带宽,那么创建账户只会消耗带宽,否则,会烧掉0.1个TRX来支付带宽费用,同时需要额外支付 1 TRX的创建费用 ``` -curl -X POST http://127.0.0.1:8090/wallet/createaccount -d '{"owner_address":"41d1e7a6bc354106cb410e65ff8b181c600ff14292", "account_address": "41e552f6487585c2b58bc2c9bb4492bc1f17132cd0"}' +curl -X POST http://127.0.0.1:8090/wallet/createaccount +--header 'Content-Type: application/json' +-d '{ + "owner_address":"41d1e7a6bc354106cb410e65ff8b181c600ff14292", + "account_address": "41e552f6487585c2b58bc2c9bb4492bc1f17132cd0" + }' ``` 参数: From 06967ca2895dc1a62145ff1049b3477e237be3de Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Wed, 11 Dec 2024 10:29:16 +0800 Subject: [PATCH 08/15] update bandwidth recover --- docs/mechanism-algorithm/resource.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/mechanism-algorithm/resource.md b/docs/mechanism-algorithm/resource.md index 49e48c500..5c43f3b40 100644 --- a/docs/mechanism-algorithm/resource.md +++ b/docs/mechanism-algorithm/resource.md @@ -29,8 +29,18 @@ Bandwidth Points的获取分两种: -- 通过质押TRX获取的Bandwidth Points, 额度 = 为获取Bandwidth Points质押的TRX / 整个网络为获取Bandwidth Points质押的TRX 总额 * 43_200_000_000,也就是所有用户按质押的TRX数量平分固定额度的Bandwidth Points. -- 每个账号每天有固定免费额度的带宽,为600。 +- 通过质押TRX获取的Bandwidth Points。 +- 每个账号每天有固定免费额度的带宽,目前为600,由61号提案控制。 + +其中质押获取的带宽计算公式为: + +`NetLimit = FrozenBandwidthAmount / TotalNetWeight * TotalNetLimit` + +- FrozenBandwidthAmount: 为获取Bandwidth Points质押的TRX +- TotalNetWeight: 整个网络为获取Bandwidth Points质押的TRX 总额 +- TotalNetLimit = 43_200_000_000 + +也就是所有用户按质押的TRX数量平分固定额度的Bandwidth Points。 ### 2. Bandwith Points的消耗 @@ -61,7 +71,16 @@ Bandwidth Points是一个账户1天内能够使用的总字节数。一定时间 ### 4. 带宽的自动恢复 -账户的免费带宽和质押TRX获取的带宽消耗后, 会在24小时内逐步恢复。 +账户的免费带宽和质押TRX获取的带宽消耗后,会在24小时内逐步恢复。 +其中每次计算质押剩余可用带宽的公式为: + +`AvailableNetUsage = NetLimit - LastUsage * (CurrentTime - LastUseTime) / RecoveryWindow(24h)` + +当 `CurrentTime - LastUseTime >= 24h` 时 `AvailableNetUsage = NetLimit`, +其中NetLimit的公式就是上面质押获取带宽的计算公式。通过这个公式实现24小时的质押带宽恢复。 + +如果交易需要消耗质押带宽,当 `AvailableNetUsage >= NewCost `则可顺利消耗质押带宽,并设置新的 +`LastUsage = AvailableNetUsage - NewCost, LastUseTime = CurrentTime`。 ### 5. 账户带宽余额查询 From 96b0cfe1c5ce8a530834a2333857d729d33513b9 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Wed, 11 Dec 2024 11:00:45 +0800 Subject: [PATCH 09/15] reorder mkdocs --- docs/api/http.md | 16 ++++++++++++---- docs/mechanism-algorithm/resource.md | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/api/http.md b/docs/api/http.md index 3fc329ae5..478f44bdb 100644 --- a/docs/api/http.md +++ b/docs/api/http.md @@ -102,7 +102,9 @@ curl -X POST http://127.0.0.1:8090/wallet/createaccount #### wallet/getaccount 作用:查询一个账户的信息 ``` -curl -X POST http://127.0.0.1:8090/wallet/getaccount -d '{"address": "41E552F6487585C2B58BC2C9BB4492BC1F17132CD0"}' +curl -X POST http://127.0.0.1:8090/wallet/getaccount +--header 'Content-Type: application/json' +-d '{"address": "41E552F6487585C2B58BC2C9BB4492BC1F17132CD0"}' ``` 参数:`address` 账户地址 @@ -111,7 +113,12 @@ curl -X POST http://127.0.0.1:8090/wallet/getaccount -d '{"address": "41E552F64 #### wallet/updateaccount 作用:修改账号名称 ``` -curl -X POST http://127.0.0.1:8090/wallet/updateaccount -d '{"account_name": "0x7570646174654e616d6531353330383933343635353139" ,"owner_address":"41d1e7a6bc354106cb410e65ff8b181c600ff14292"}' +curl -X POST http://127.0.0.1:8090/wallet/updateaccount +--header 'Content-Type: application/json' +-d '{ +"account_name": "0x7570646174654e616d6531353330383933343635353139" , +"owner_address":"41d1e7a6bc354106cb410e65ff8b181c600ff14292" +}' ``` 参数: @@ -125,8 +132,9 @@ curl -X POST http://127.0.0.1:8090/wallet/updateaccount -d '{"account_name": "0 #### wallet/accountpermissionupdate 作用:修改账户权限 ``` -curl -X POST http://127.0.0.1:8090/wallet/accountpermissionupdate -d -'{ +curl -X POST http://127.0.0.1:8090/wallet/accountpermissionupdate +--header 'Content-Type: application/json' +-d '{ "owner_address": "TRGhNNfnmgLegT4zHNjEqDSADjgmnHvubJ", "owner": { "type": 0, diff --git a/docs/mechanism-algorithm/resource.md b/docs/mechanism-algorithm/resource.md index 5c43f3b40..3a37320fb 100644 --- a/docs/mechanism-algorithm/resource.md +++ b/docs/mechanism-algorithm/resource.md @@ -72,7 +72,7 @@ Bandwidth Points是一个账户1天内能够使用的总字节数。一定时间 ### 4. 带宽的自动恢复 账户的免费带宽和质押TRX获取的带宽消耗后,会在24小时内逐步恢复。 -其中每次计算质押剩余可用带宽的公式为: +其中每次计算质押剩余可用带宽的等价公式为: `AvailableNetUsage = NetLimit - LastUsage * (CurrentTime - LastUseTime) / RecoveryWindow(24h)` From 434ee94648b1268badf76c93b0d09d2e402f488a Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Wed, 11 Dec 2024 15:07:37 +0800 Subject: [PATCH 10/15] add image --- docs/introduction/dpos.md | 9 +++++++-- images/solidate_blocks.png | Bin 0 -> 111573 bytes 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 images/solidate_blocks.png diff --git a/docs/introduction/dpos.md b/docs/introduction/dpos.md index 4f0f67560..196508877 100644 --- a/docs/introduction/dpos.md +++ b/docs/introduction/dpos.md @@ -48,7 +48,7 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分 2、投票过程 -波场中设定对候选人的投票过程是一笔特殊类型的交易,节点可以通过生成一笔投票交易对候选人进行投票。 +波场中设定对候选人的投票过程是一笔特殊类型的交易,节点可以通过生成一笔投票交易对候选人进行投票。投票交易接口参考[API说明](../api/http.md/#walletvotewitnessaccount)。 3、统计票 @@ -75,7 +75,12 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分 ### 固化块原则 -刚生产出来的区块处于未确认状态,只有被27个Witness中70%以上(即27 * 70% = 19, 向下取整)的witness"认可"的区块才被认为是不可逆区块,一般称为固化块,此时固化块中包含的交易已经被整个区块链网络确认。此处对未确认状态区块"认可"的方式是Witness在其之后生产后继区块,如图d中Witness C生产的第103块,Witness E在第103块的基础上生产了104‘,Witness G、A、B分别生产的第105‘、106’、107‘实质上也是103块的后继区块,故也是对C生产的第103块的认可。可知,当高度为121的区块被生产出来的时候,第103块就成为固化块,因为此时103区块已经有了19个后继区块,此处需要强调的一点是:生产这19个区块的Witness互不相同,并且和生产第103个区块的Witness也不同。 +刚生产出来的区块处于未确认状态,只有被27个Witness中70%以上(即27 * 70% = 19, 向下取整)的witness"认可"的区块才被认为是不可逆区块,一般称为固化块,此时固化块中包含的交易已经被整个区块链网络确认。 +对未确认状态区块"认可"的方式是Witness在其之后生产后继区块,如图下中节点0的记账人生产第100块,节点1的记账人在第100块的基础上生产了101,其它节点的记账人分别生产的第102、103、104个区块实质上也是100块的后继区块,故也是对第100区块的认可。 + +![image](https://raw.githubusercontent.com/dongdongsunny/documentation-zh/master/images/solidate_blocks.png) + +可知,当高度为119的区块被生产出来的时候,第101块就成为固化块,因为此时119区块已经有了19个后继区块等于被19个记账节点认可了。此处需要强调的一点是:生产这19个区块的Witness互不相同,并且和生产第103个区块的Witness也不同。Tron节点在接受到广播新的区块时会检查区块的有效性,其中一个就是记账人是否正确。 ### 最长链原则 diff --git a/images/solidate_blocks.png b/images/solidate_blocks.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1c90ef723c3efcf0c257e2e37fc0be1d2e6e7c GIT binary patch literal 111573 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 Date: Wed, 11 Dec 2024 15:08:01 +0800 Subject: [PATCH 11/15] mkdoc --- mkdocs.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index aafbe37d2..32db40a4e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,19 +5,6 @@ repo_url: https://github.com/tronprotocol/documentation-zh nav: - 入门: - Java-tron入门: 'getting_started/getting_started_with_javatron.md' - - 使用Java-tron: - - 部署Java-tron: using_javatron/installing_javatron.md - - 备份和恢复: using_javatron/backup_restore.md - - 轻节点: developers/litefullnode.md - - 私链网络: using_javatron/private_network.md - - 事件订阅: architecture/event.md - - 数据库配置: architecture/database.md - - 网络配置: using_javatron/connecting_to_tron.md - - 节点监控: using_javatron/metrics.md - - 节点维护工具: using_javatron/toolkit.md - - API 接口: - - HTTP 接口: api/http.md - - gRPC 接口: api/rpc.md - 核心协议: - 波场共识: introduction/dpos.md - 超级代表: mechanism-algorithm/sr.md @@ -27,7 +14,20 @@ nav: - 系统合约: mechanism-algorithm/system-contracts.md - 去中心化交易所: mechanism-algorithm/dex.md - 多重签名: mechanism-algorithm/multi-signatures.md - - Java-tron开发: + - 使用Java-tron: + - 部署Java-tron: using_javatron/installing_javatron.md + - 备份和恢复: using_javatron/backup_restore.md + - 轻节点: developers/litefullnode.md + - 私链网络: using_javatron/private_network.md + - 事件订阅: architecture/event.md + - 数据库配置: architecture/database.md + - 网络配置: using_javatron/connecting_to_tron.md + - 节点监控: using_javatron/metrics.md + - 节点维护工具: using_javatron/toolkit.md + - API 接口: + - HTTP 接口: api/http.md + - gRPC 接口: api/rpc.md + - Java-tron开发: - 开发者指南: developers/java-tron.md - TIPs工作流程: developers/tips.md - Issue工作流程: developers/issue-workflow.md @@ -35,11 +35,11 @@ nav: - 配置IDE开发环境: developers/run-in-idea.md - 开发示例: developers/demo.md - 核心模块: developers/code-structure.md - - Dapp开发: - - Dapp开发工具: contracts/compiler.md - - Wallet-cli: + - Wallet-cli: - 什么是Wallet-Cli: clients/wallet-cli.md - Wallet命令: clients/wallet-cli-command.md + - Dapp开发: + - Dapp开发工具: contracts/compiler.md - 版本发布: - 新版本部署手册: releases/upgrade-instruction.md - 一致性检验: releases/signature_verification.md From 97e05065ecef2102c9067fa59532f25e7f2bdcb7 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Thu, 12 Dec 2024 15:21:07 +0800 Subject: [PATCH 12/15] update sr --- docs/introduction/dpos.md | 5 ++-- docs/mechanism-algorithm/sr.md | 50 ++++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/docs/introduction/dpos.md b/docs/introduction/dpos.md index 196508877..4c420e487 100644 --- a/docs/introduction/dpos.md +++ b/docs/introduction/dpos.md @@ -24,7 +24,7 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分 * 波场币:指由波场区块链系统发行并在系统中流转的权益通证,代号是TRX。 -* 记账候选人:指波场中有成为记账人资格的节点。 +* 记账候选人Witness:指波场中有成为记账人资格的节点, 在波场中统称为Witness。 * 记账人:指波场中获得记账资格的节点,通常DPOS共识中将记账人称为witness,波场也将记账人称为super node(简称SR),波场设定记账人的数量是27个。下文不区分记账人、witness、supernode、SR等概念。 @@ -77,9 +77,7 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分 刚生产出来的区块处于未确认状态,只有被27个Witness中70%以上(即27 * 70% = 19, 向下取整)的witness"认可"的区块才被认为是不可逆区块,一般称为固化块,此时固化块中包含的交易已经被整个区块链网络确认。 对未确认状态区块"认可"的方式是Witness在其之后生产后继区块,如图下中节点0的记账人生产第100块,节点1的记账人在第100块的基础上生产了101,其它节点的记账人分别生产的第102、103、104个区块实质上也是100块的后继区块,故也是对第100区块的认可。 - ![image](https://raw.githubusercontent.com/dongdongsunny/documentation-zh/master/images/solidate_blocks.png) - 可知,当高度为119的区块被生产出来的时候,第101块就成为固化块,因为此时119区块已经有了19个后继区块等于被19个记账节点认可了。此处需要强调的一点是:生产这19个区块的Witness互不相同,并且和生产第103个区块的Witness也不同。Tron节点在接受到广播新的区块时会检查区块的有效性,其中一个就是记账人是否正确。 ### 最长链原则 @@ -89,6 +87,7 @@ DPOS共识在区块链系统中根据节点获取选票的多少确定出部分 ## 激励模型 为了保证区块链系统安全高效地运行,TRON设定激励模型,用于鼓励更多的节点加入到波场网络,从而扩大网络规模。波场网络每生成一个区块,都会授予16个TRX的区块奖励给生产该区块的超级代表,还会授予160个TRX的投票奖励给所有超级代表和超级合伙人(票数排名第28~127名的超级代表候选人也叫超级代表合伙人),他们根据获得的投票数按比例瓜分投票奖励。同时,超级代表及合伙人还会将获得的奖励按照其设定的佣金比例扣除后,将剩余部分按照选民投票比例分发给选民。 +具体计算规则参考下一章[超级代表的奖励](../mechanism-algorithm/sr.md/#3)。 ## 基于提案对参数进行调整 diff --git a/docs/mechanism-algorithm/sr.md b/docs/mechanism-algorithm/sr.md index a06f2b4a4..6ec9fe086 100644 --- a/docs/mechanism-algorithm/sr.md +++ b/docs/mechanism-algorithm/sr.md @@ -31,39 +31,65 @@ votewitness witness1 3 witness2 7 # 同时给witness1投了3票,给witness2投 ### Witnesses分红 -默认比例是20%,超级代表和超级代表合伙人可以通过wallet/getBrokerage接口查询佣金比例, 也可以通过wallet/updateBrokerage接口修改佣金比例。 +默认比例是20%,超级代表和超级代表合伙人可以通过[wallet/getBrokerage](../api/http.md/#walletgetbrokerage)接口查询佣金比例, 也可以通过[wallet/updateBrokerage](../api/http.md/#walletupdatebrokerage)接口修改佣金比例。 如果一个witness获得20%的奖励,那么剩余的80%奖励会被分配给投票者。如果分红比例设置为100%,那么只有witness可以获得奖励;相反,如果设置为0,那么只有投票者会获得奖励。 -## 3. 超级代表的奖励 +## 3. 超级代表和合伙人的奖励 -### 投票奖励 +### 票数奖励 -票数奖励是每生成一个区块奖励160TRX,总奖励数是4,608,000 TRX / 天。 +票数奖励是每生成一个区块奖励160TRX,分给SR和Partner。 -对每一个SR与Partner,每天获得的票数奖励 = 4,608,000 * ( 获得的票数 / 总票数) x 20% TRX +`每天总票数奖励数 = (24h/出块时间3s) * 160 = 4,608,000 TRX / 天` + +对每一个SR与Partner,每天获得的票数奖励TRX = 总奖励数 * ( 获得的票数 / SR与Partner的总票数) x 分红比例 ### 出块奖励 -波场协议网络每3秒中会出一个区块,每个区块将给予超级代表16个TRX奖励,每年总计168,192,000 TRX将会被奖励给超级代表。 +波场协议网络每3秒中会出一个区块,每个区块将给予超级代表16个TRX奖励,每年总计 365 * 24 * 3600 * 16TRX / 3 = 168,192,000 TRX将会被奖励给超级代表。 -超级代表每次出块完成后,出块奖励都会发到超级代表的子账号当中,超级代表不能直接使用这部分资产,但可以查询。 每24h允许一次提取操作。从该子账号转移到超级代表的账户中。 +超级代表每次出块完成后,出块奖励都会发到超级代表的账号当中,超级代表不能直接使用这部分资产,但可以查询。 -16 (TRX/区块) * 28,800 (总区块数/day) = 460,800 (TRX/天) +`每天总出块奖励 = (24h/出块时间3s) * 16 = 460,800 (TRX/天)` -对每一个SR,每天获得的出块奖励 = (460,800 / 27) x 20% TRX +单个SR每天获得的出块奖励 = (460,800 / 27) x Witness分红 TRX 实际奖励可能会比理论上的奖励少,因为出块失败或者维护期切换。 +### 奖励领取 +SR与Partner的票数奖励以Allowance的方式记录在账户里面,每次新的区块生成之后会随即更新,通过[wallet/getaccount](../api/http.md/#walletgetaccount)可以查询。 +统一通过[wallet/withdrawbalance](../api/http.md/#withdrawbalance)把账户相关的票数, 出块以及结算的投票奖励领取到账户余额,每24小时限领一次。 + ## 4. 投票者的奖励 -如果投票给Super Representative: +每次出块时,投票者都会根据Witness分红比例获取所投SR或Partner对应的奖励:从SR分成出块和票数奖励,和从Partner分成票数奖励。 +我们根据下面的参数公式,计算投票奖励: + +- `总投票比例 = 你的投票数 / SR和Partner获取的总票数` +- `选民抽成 = (1 - Witness分红)` + +如果投票给SR: -每日获得奖励 = (((你投给一个witness的票数) *4,608,000 / 总票数)* 80%) + ((460,800 / 27) *80%)* (你投给一个witness的票数) / (一个witness获得的总票数) TRX +- 如果轮到该SR出块 `每次出块获得的Reward =(SR投票比例 * 16 + 总投票比例 * 160)* 选民抽成 TRX` +- 如果不是该SR出块 `每次出块获得的Reward =(总投票比例 * 160)* 选民抽成 TRX` +- `每日获得总奖励 = (SR投票比例 * 每天总出块奖励 / 27 + 总投票比例 * 每天总票数奖励数)* 选民抽成 TRX` +- `SR投票比例 = 你的投票数 / 该SR获取的总票数` 如果你投票给Partner: -每日获得奖励 = (((你投给一个witness的票数) *4,608,000 / 总票数)* 80%) TRX +- `每次出块获得的Reward =(总投票比例 * 160)* 选民抽成 TRX` +- `每日获得总奖励 = 总投票比例 * 每天总票数奖励数 * 选民抽成 TRX` + +注意:上面的每日获得总奖励公式是在稳定不变的情况下一天获取的奖励,实际情况每6个小时维护期后SR和Partner可能有变动,或者出块失败,奖励应该会变小。 + +每次产块后波场的具体计算逻辑是:java-tron会以SR和Partner的账户地址+维护期Cycle为key累加新的分成Reward到代理存储delegationStore。 +然后在维护期结束时,对每个witness计算本维护期Cycle的累积witnessVi = lastCycle witnessVi + (currentCycle reward)/voteCount, +即把每轮每个选票分得的reward累加一起。投票账户获得的奖励计算是从上次领取过的Cycle到上个维护期Cycle的witnessVi的差值,然后更新领取过的Cycle。 +接口[wallet/getreward](../api/http.md/#walletgetreward)会返回结算过的可领的投票奖励+Allowance(见上面章节)。 + +### 奖励领取 +统一通过[wallet/withdrawbalance](../api/http.md/#withdrawbalance)把账户相关的票数, 出块以及投票的奖励领取到账户余额,每24小时限领一次。 ## 5. 委员会 From 8914315fea339d53988c89b4c9c2e94f5c283256 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Thu, 12 Dec 2024 15:38:34 +0800 Subject: [PATCH 13/15] update sr --- docs/mechanism-algorithm/sr.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/mechanism-algorithm/sr.md b/docs/mechanism-algorithm/sr.md index 6ec9fe086..48be8afe4 100644 --- a/docs/mechanism-algorithm/sr.md +++ b/docs/mechanism-algorithm/sr.md @@ -81,7 +81,7 @@ SR与Partner的票数奖励以Allowance的方式记录在账户里面,每次 - `每次出块获得的Reward =(总投票比例 * 160)* 选民抽成 TRX` - `每日获得总奖励 = 总投票比例 * 每天总票数奖励数 * 选民抽成 TRX` -注意:上面的每日获得总奖励公式是在稳定不变的情况下一天获取的奖励,实际情况每6个小时维护期后SR和Partner可能有变动,或者出块失败,奖励应该会变小。 +注意:上面的每日获得总奖励是理论上获取的奖励上限,实际情况每6个小时维护期后SR和Partner可能有变动,或者出块失败,或者账户重新投票,奖励应该会变小。 每次产块后波场的具体计算逻辑是:java-tron会以SR和Partner的账户地址+维护期Cycle为key累加新的分成Reward到代理存储delegationStore。 然后在维护期结束时,对每个witness计算本维护期Cycle的累积witnessVi = lastCycle witnessVi + (currentCycle reward)/voteCount, @@ -89,13 +89,13 @@ SR与Partner的票数奖励以Allowance的方式记录在账户里面,每次 接口[wallet/getreward](../api/http.md/#walletgetreward)会返回结算过的可领的投票奖励+Allowance(见上面章节)。 ### 奖励领取 -统一通过[wallet/withdrawbalance](../api/http.md/#withdrawbalance)把账户相关的票数, 出块以及投票的奖励领取到账户余额,每24小时限领一次。 +统一通过[wallet/withdrawbalance](../api/http.md/#walletwithdrawbalance)把账户相关的票数, 出块以及投票的奖励领取到账户余额,每24小时限领一次。 ## 5. 委员会 ### 5.1 什么是委员会 -委员会用于修改Tron网络动态参数,如出块奖励、交易费用等等。委员会由当前的27个超级代表组成。每个超级代表都具有提议权、对提议的投票权, +委员会用于修改Tron网络动态参数,如出块奖励、交易费用等等。委员会由当前的27个超级代表组成。每个超级代表都具有提议权、对提议的投票权。从提议创建时间开始,3天时间内为提议的有效期。 当提议获得18个代表及以上的赞成票时,该提议获得通过,并在下个维护期内进行网络参数修改。 ### 5.2 创建提议 @@ -104,7 +104,7 @@ SR与Partner的票数奖励以Allowance的方式记录在账户里面,每次 TRON网络动态参数及其编号请参考[这里](https://tronscan.org/#/sr/committee)。 -+ 示例: ++ Wallet-Cli指令示例: ```text createproposal id0 value0 ... idN valueN @@ -118,7 +118,7 @@ value0_N: 新参数值 提议仅支持投赞成票,不投票代表不赞同。从提议创建时间开始,3天时间内为提议的有效期。超过该时间范围,该提议如果没有获得足够的 赞成票,该提议失效。允许取消之前投的赞成票。 -+ 示例: ++ Wallet-Cli指令示例: ```shell approveProposal id is_or_not_add_approval @@ -130,7 +130,7 @@ is_or_not_add_approval: 赞成或取消赞成 提议创建者,能够在提议生效前,取消提议。 -+ 示例: ++ Wallet-Cli指令示例: ```shell deleteProposal proposalId @@ -141,8 +141,8 @@ id: 提议Id,根据提议创建时间递增 以下接口可以查询提议,包括: -+ 查询所有提议信息(ListProposals) -+ 分页查询提议信息(GetPaginatedProposalList) -+ 查询指定提议信息(GetProposalById) ++ 查询所有提议信息[wallet/listproposals](../api/http.md/#walletlistproposals) ++ 分页查询提议信息[wallet/getpaginatedproposallist](../api/http.md/#walletgetpaginatedproposallist) ++ 查询指定提议信息[wallet/getproposalbyid](../api/http.md/#walletgetproposalbyid) -相关api详情,请查询[Tron HTTP API](../api/http.md). +相关api详情,请查询[Tron HTTP API](../api/http.md/#_6). From d8d43313dbd7b16f9a0dc4aa39922e63fccd8925 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Thu, 12 Dec 2024 17:41:32 +0800 Subject: [PATCH 14/15] update resource, bandwidth consume --- docs/mechanism-algorithm/account.md | 15 +++++++---- docs/mechanism-algorithm/resource.md | 38 ++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/docs/mechanism-algorithm/account.md b/docs/mechanism-algorithm/account.md index 5da690157..19827fd8b 100644 --- a/docs/mechanism-algorithm/account.md +++ b/docs/mechanism-algorithm/account.md @@ -4,14 +4,19 @@ TRON采用账户模型,账户的唯一标识为地址(address),对账户操作需要私钥签名。每个账户可以拥有TRX、TRC10 Token、带宽、能量等各种资源。通过发送交易可以增减TRX或者TRC10 Token余额,可以发布并拥有智能合约,也可以调用自己或者他人发布的智能合约。可以申请成为超级代表并被投票,也可以对超级代表进行投票等等。TRON所有的活动都围绕账户进行。 -## 创建账号的方式 +## 创建波场账号的方式 -1. 首先用钱包或者浏览器生成私钥和地址,公钥可以丢弃。由已有老账户往目标地址发送TRX或者Token,并广播到网络后将完成账户创建的流程。 +1. 首先用钱包或者浏览器生成私钥和地址,然后由已有老账户往目标地址发送TRX或者TRC10 Token,并广播到网络后将完成账户创建的流程。 -2. 通过调用CreateAccount内置合约,完成创建账户 +2. 通过调用[wallet/createaccount](../api/http.md/#walletcreateaccount)系统合约,完成创建账户。 如果账户有足够的通过质押TRX获得的带宽,那么创建账户只会消耗带宽,否则,创建账户会烧掉0.1个TRX。 +### 未激活状态 +注意:由上述第一种方式创建的私钥和地址,比如TranLink钱包创建的账户,对于波场来说属于未激活的状态,也就是在java-tron逻辑中没有创建这个地址对应的账户对象。 +如果此时往该地址发送智能合约交易,交易会成功,但是从新创建的账户查询交易记录会返回空,从调用方可以正常查询记录。当然新创建的地址发起交易也会失败,因为没有对应的账户对象,对应的带宽和能量也是为0。 +激活一个已经创建的地址就通过往改地址发送TRX或TRC10系统专属合约token。 + ## 生成密钥对算法 Tron的签名算法为ECDSA,选用曲线为SECP256K1。其私钥为一个随机数,公钥为椭圆曲线上一个点。生成过程为,首先生成一个随机数d作为私钥,再计算P = d * G作为公钥;其中G为椭圆曲线的基点。 @@ -31,7 +36,7 @@ ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" 1. 取交易的rawdata,转成byte[]格式。 2. 对rawdata进行sha256运算。 -3. 用交易每个合约中地址对应的私钥(现在一般就是一个合约,一个私钥),对sha256的结果进行签名。 +3. 用交易发起账户的私钥,对sha256的结果进行签名。 4. 把签名结果添加到交易中。 ### 算法 @@ -50,7 +55,7 @@ ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" 注意:签名结果应该是65字节。 r 32字节, s 32字节,v 1个字节。 -3. fullnode节点收到交易后会进行验签,由hash 和 r、s、v计算出一个地址,与合约中的地址进行比较,相同则为验签通过。 +3. fullnode节点收到交易后会进行验签,由hash 和 r、s、v计算出一个地址,与交易rawData中的发起交易地址进行比较,相同则为验签通过。 ### 示例 diff --git a/docs/mechanism-algorithm/resource.md b/docs/mechanism-algorithm/resource.md index 3a37320fb..6b43ad0a3 100644 --- a/docs/mechanism-algorithm/resource.md +++ b/docs/mechanism-algorithm/resource.md @@ -4,7 +4,7 @@ 投票权、带宽和能量是TRON网络中的重要系统资源。其中投票权用于给超级代表投票;带宽是衡量保存在区块链数据库中的交易字节大小的单位,交易越大,消耗的带宽资源会越多。能量是衡量在TRON网络上TVM虚拟机执行特定操作所需的计算量的单位,由于智能合约交易都需要计算资源来执行,因此每笔智能合约交易都需要付费。 -下文我们把投票权也称为TP、带宽也称为Bandwidth Points,能量也称为Energy。 +下文我们把投票权也称为TRON Power(TP)、带宽也称为Bandwidth Points,能量也称为Energy。 !!! note - 普通交易仅消耗Bandwidth points @@ -14,7 +14,29 @@ 任何账户在给超级代表投票前,都需要先获得投票权,即TRON Power(TP)。投票权可以通过质押TRX来获取。质押TRX除了可以获得带宽或者能量外,还将同时获得投票权,选民质押1TRX,将获得1TP。关于如何质押请参考[在TRON网络上质押](#tron)章节。 -选民可以分批多次质押,多次质押获取到的投票权会被累加到选民账户内,选民可以通过`wallet/getaccountresource`接口查询账户拥有的投票权总数以及已使用的投票权数量。 +选民可以分批多次质押,多次质押获取到的投票权会被累加到选民账户内,选民可以通过[wallet/getaccount](../api/http.md/#walletgetaccount)接口查询账户拥有的投票权总数以及已使用的投票权数量。 + ++ 示例接口结果: +``` +{ + "address": "TBEJewE3MWBbW9t7F4s875yvMHrhqBAZfB", + "votes": [ + { + "vote_address": "TFMehqCGCei9RrJLdM5eRFuwHY4CrYy6Xt", + "vote_count": 7003 + }, + { + "vote_address": "TE8dLwHkMrutMKULTZE41knERrT5XiLVeN", + "vote_count": 7003 + }, + { + "vote_address": "TYcvQx7rFuDgyauJmfxBxj7ppkAsSa3sJe", + "vote_count": 7003 + } + ], +... +} +``` ## 带宽 @@ -22,9 +44,6 @@ 如一条交易的字节数为200,那么该交易需要消耗 200 Bandwidth Points。 -!!! note - 由于网络中总质押资金以及账户的质押资金随时可能发生变化,因此账户拥有的 Bandwidth Points 不是固定值。 - ### 1. Bandwidth Points的来源 Bandwidth Points的获取分两种: @@ -42,6 +61,9 @@ Bandwidth Points的获取分两种: 也就是所有用户按质押的TRX数量平分固定额度的Bandwidth Points。 +!!! note + 由于网络中总质押资金以及账户的质押资金随时可能发生变化,因此账户拥有的 Bandwidth Points 不是固定值。 + ### 2. Bandwith Points的消耗 除了查询操作,任何交易都需要消耗 bandwidth points。 @@ -56,14 +78,14 @@ Bandwidth Points是一个账户1天内能够使用的总字节数。一定时间 1. 尝试消耗交易发起者质押获取的Bandwidth Points。如果交易发起者Bandwidth Points不足,则进入下一步 2. 尝试消耗交易发起者的TRX,这部分烧掉0.1TRX -如果交易是Token转账,Bandwidth Points消耗如下: +如果交易是TRC-10 Token转账,Bandwidth Points消耗如下: -1. 依次验证 发行Token资产总的免费Bandwidth Points是否足够消耗,转账发起者的Token剩余免费Bandwidth Points是否足够消耗,Token发行者质押TRX获取Bandwidth Points剩余量是否足够消耗。如果满足则扣除Token发行者质押获取的Bandwidth Points,任意一个不满足则进入下一步 +1. 依次验证发行Token资产总的免费Bandwidth Points是否足够消耗,转账发起者的Token剩余免费Bandwidth Points是否足够消耗,Token发行者质押TRX获取Bandwidth Points剩余量是否足够消耗。如果满足则扣除Token发行者质押获取的Bandwidth Points,任意一个不满足则进入下一步 2. 尝试消耗交易发起者质押获取的Bandwidth Points。如果交易发起者Bandwidth Points不足,则进入下一步 3. 尝试消耗交易发起者的免费Bandwidth Points。如果免费Bandwidth Points也不足,则进入下一步 4. 尝试消耗交易发起者的TRX,交易的字节数 * 1000 sun -如果交易普通交易,Bandwidth Points消耗如下: +如果是其它交易,Bandwidth Points消耗如下: 1. 尝试消耗交易发起者质押获取的Bandwidth Points。如果交易发起者Bandwidth Points不足,则进入下一步 2. 尝试消耗交易发起者的免费Bandwidth Points。如果免费Bandwidth Points也不足,则进入下一步 From 72499034b82a5d0c959bced3dca08804d8325274 Mon Sep 17 00:00:00 2001 From: Sunny Jiao <> Date: Fri, 13 Dec 2024 16:42:25 +0800 Subject: [PATCH 15/15] update energy related logic --- docs/api/http.md | 6 ++-- docs/mechanism-algorithm/resource.md | 51 ++++++++++++++++++++++++++-- docs/mechanism-algorithm/sr.md | 3 +- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/docs/api/http.md b/docs/api/http.md index 478f44bdb..196c1895f 100644 --- a/docs/api/http.md +++ b/docs/api/http.md @@ -368,7 +368,9 @@ curl -X POST http://127.0.0.1:8090/wallet/getapprovedlist -d '{ #### wallet/getaccountresource 作用:查询账户的资源信息 ``` -curl -X POST http://127.0.0.1:8090/wallet/getaccountresource -d {"address" : "419844f7600e018fd0d710e2145351d607b3316ce9"} +curl -X POST http://127.0.0.1:8090/wallet/getaccountresource +--header 'Content-Type: application/json' +-d {"address" : "419844f7600e018fd0d710e2145351d607b3316ce9"} ``` 参数: @@ -454,7 +456,7 @@ curl -X POST http://127.0.0.1:8090/wallet/freezebalancev2 -d }' ``` -参数: +参数: - `owner_address`: 质押TRX 账号的地址, HEX 格式或 Base58check 格式 - `frozen_balance`: 质押TRX 的数量, 单位为sun diff --git a/docs/mechanism-algorithm/resource.md b/docs/mechanism-algorithm/resource.md index 6b43ad0a3..b0241ca00 100644 --- a/docs/mechanism-algorithm/resource.md +++ b/docs/mechanism-algorithm/resource.md @@ -121,17 +121,56 @@ Bandwidth Points是一个账户1天内能够使用的总字节数。一定时间 ### 1. Energy的获取与消耗 -质押获取Energy,即将持有的trx锁定,无法进行交易,作为抵押,并以此获得免费使用Energy的权利。具体计算与全网所有账户质押有关,可参考相关部分计算。 +质押获取Energy,即将持有的TRX锁定,无法进行交易,作为抵押,并以此获得免费使用Energy的权利。具体计算与全网所有账户质押有关,可参考下面计算逻辑。 #### 质押获得能量 +通过调用接口[wallet/freezebalancev2](../api/http.md/#walletfreezebalancev2),或下面Wallet-cli指令: + ```text freezeBalanceV2 frozen_balance [ResourceCode:0 BANDWIDTH,1 ENERGY] ``` -通过质押TRX获取的Energy 额度 = 为获取Energy质押的TRX / 整个网络为获取Energy质押的TRX 总额 * 180_000_000_000。 +接口[wallet/getaccount](../api/http.md/#walletgetaccount)可以查询账户当前为获取Energy质押的TRX,示例返回: +``` +{ + "address": "TBEJewE3MWBbW9t7F4s875yvMHrhqBAZfB", + "balance": 26795494669, + "frozenV2": [ + { + "amount": 1002000000 // Bandwith + }, + { + "type": "ENERGY", + "amount": 20001000000 + }, + { + "type": "TRON_POWER" + } + ], + ... ... +} +``` -也就是所有用户按质押的TRX数量平分固定额度的Energy,示例: +##### 质押获得的能量计算 +通过质押TRX获取的能量公式为: +`Energy_Limit = 为获取Energy质押的TRX / TotalEnergyWeight * TotalEnergyLimit` +。 +TotalEnergyWeight:整个网络为获取Energy质押的TRX总额 +其中Total_Energy_Limit = 180000000000,由#19号提议决定,后续数值变动可以查看[Network Parameters](https://tronscan.org/#/sr/committee)。 +也就是所有用户按质押的TRX数量平分固定额度的Energy。 + +具体账户的能量数值,可以调用接口[wallet/getaccountresource](../api/http.md/#walletgetaccountresource)查看,示例返回: +``` +{ + ... + "EnergyLimit": 1459402, // Dynamic changed as TotalEnergyWeight changes + "TotalEnergyLimit": 180000000000, // Static value follow propsal #19 + "TotalEnergyWeight": 2466887064 +} +``` + +账户获得的Energy Limit是会动态调整的,示例: ```text 如全网只有两个人A,B分别质押2TRX,2TRX。 @@ -169,6 +208,12 @@ B: 30_000_000_000 且energy_limit 为36_000_000_000 账户的能量资源消耗后,会在24小时内逐步恢复。 +其中每次计算质押剩余可用能量的等价公式为: + +`EnergyLimit - LastUsage * (CurrentTime - LastUseTime) / RecoveryWindow(24h)` +当 `CurrentTime - LastUseTime >= 24h` 时 `Account_Left_Energy = EnergyLimit`, +其中EnergyLimit的公式就是上面质押获取EnergyLimit的计算公式。通过这个公式实现24小时的质押能量恢复。 + #### 账户能量余额查询 首先调用节点HTTP接口wallet/getaccountresource来获取账户当前的资源状态,然后通过如下公式计算能量余额: diff --git a/docs/mechanism-algorithm/sr.md b/docs/mechanism-algorithm/sr.md index 48be8afe4..2c2822daa 100644 --- a/docs/mechanism-algorithm/sr.md +++ b/docs/mechanism-algorithm/sr.md @@ -145,4 +145,5 @@ id: 提议Id,根据提议创建时间递增 + 分页查询提议信息[wallet/getpaginatedproposallist](../api/http.md/#walletgetpaginatedproposallist) + 查询指定提议信息[wallet/getproposalbyid](../api/http.md/#walletgetproposalbyid) -相关api详情,请查询[Tron HTTP API](../api/http.md/#_6). +相关api详情,请查询[Tron HTTP API](../api/http.md/#_6)。 +其他相关参考文档[super-representatives](https://developers.tron.network/docs/super-representatives).