java-tron 区块处理
前言区块链当中,所有的交易都包含在区块中,如何验证每一次接收到的区块的合法性就至关重要。区块链是分布式的、对外公开的,所有人都可以参与,有些恶意节点通过修改代码的形式加入到区块链中,把一些对自己有利的交易、区块广播到节点当中,使这些交易对自己有利。所以判断合法交易、区块就尤为重要。这些操作都是交易区块链当中的各个节点进行验证。
区块区块是用来包含tron网中的交易的数据结构,是由27个超级节点(SR),每隔3秒,依次轮流将交易打包后的数据结构。
处理区块处理入口区块处理主要有两个入口,也对应两种场景:
同步处理区块
追块处理区块
同步处理区块,是节点之前本节点和网络中的节点区块之前高度没有差异,同步接收最新的区块。追块处理区块,本节点区块高度落后网络中的节点太远,需要追到最新高度后,转换为同步处理区块。
同步处理区块入口类:TronNetHandlerTronNetHandler 是一个 Netty 的 Handler,接收其他节点的消息,基本和其它节点交互的入口类都是这个类。整个流程调用栈:
12345TronNetHandler.channelRead0 |---tron ...
tron 交易处理--交易执行逻辑
前言分布式区块链环境下,所有的钱包要发起交易,都可以通过网络中的FullNode节点发起交易。TRON 网络中,交易是从客户端发起,再通过 FullNode 进行广播,并将交易广播到网络的SR节点,并由SR节点进行打包。
主要角色TRON网络中,站在发起交易的角度去看,需要了解的三个角色:
钱包客户端,代表用户
FullNode全节点,用来转广播交易
SR超级节点,用来使交易上链
使用TRON网络,主要就是各种钱包客户端。构建交易,需要通过钱包应用发起,可以是手机钱包或者浏览器钱包插件,都可以发起一笔交易,也可以使用HTTP接口或者RPC接口都可以发起交易。
比如用用浏览器插件发起:
当然如果需要深入了解,可以使用官方的wallet-cli工具,通过代码的方式,了解其实现原理。官方钱包项目: https://github.com/tronprotocol/wallet-cli
交易图形界面操作,就不需要多说了,这里来了解一下使用wallet-cli工具发起的转账流程,wallet-cli就是一个客户端,图形界面当中使用客户端也是相同原理。
TRON 中有三种代币,是三种不同类型 ...
时间轮 slot 机制实现
slot机制Slot 机制,大白话,就是分片机制。可以把时间或空间分成一个个槽,通过一定算法使用这些槽的机制。
有什么用?作用是可以把数据平均分存放到某个槽空间内,比如Hash环中使用的Hash Slot。再比如数组,可以再解为是一种槽机制。这是空间是的槽机制,在时间维度,可以把时间分片,每隔一段时间,就是一个时间槽位。比如:一分钟有60秒,每2秒划分一个槽位就有30个槽,那就可以执行30次;比如:一天有86400秒,每3秒划分一个槽位就有28800个槽。
这里实现一个简单的时间槽机制,分布式场景下,通过这个机制在,去中心化的场景下,让不同的机制按照一定时间槽机制进行运作。
实现要求必须保证是精准的3秒间隔,中间代码处理业务逻辑的时间必须也要计算在内。比如,执行业务逻辑使用100毫秒,那么到下一个3秒的间隔就是2900毫秒;如果,执行业务逻辑使用500毫秒,那么到下一个3秒的间隔就是2500毫秒;如果,执行业务逻辑使用2900毫秒,那么到下一个3秒的间隔就是100毫秒;保证完整的3秒,不多不少。
思路这样的话,就要记录计算所有时间:
标记当前开始时间
记录业务逻辑处理的时间
计算出 ...
tron TaPos理解和应用
什么是TaPos全称:Transaction as Proof of Stake,基于交易的权益证明机制。大白话:这笔交易所基于的证明。啥意思?就是说,在区块链的场景当中,每一过往的笔交易都基于一个区块。因为区块链当中所有的交易都是被打包到一个个区块当中的,如果这是一笔成功的交易,那它一定是存在于某一个特定的区块当中。另外,每一笔交易都有一个唯一的Hash,保证这笔交易的唯一性。那就破案了,这里的证明就是指:区块。
有什么实际作用
防止有不包含区块引用的交易被重放到某个分叉上,这样能避免不是该分叉的区块被添加到该分叉。
告诉用户该块是在哪个分支上面。
这个需要事先了解切链场景,才能说明这个问题。
先说分叉:
在区块链网络当中,如果同时收到相同高度的区块就,链就会分叉,你可以理解为git提交记录,从master分支中切出一个新的分叉,会有人基于这个分叉不断的提交代码。在区块链的角度也是一样的,如果区块高度都是 1000 和 1000',那这个时候链就会出现分叉。
在哪里用一般在验证广播交易阶段使用。
构建交易构建一笔交易时,会将这笔交易所需要引用的区块高度带上。交易构建之后会被 ...
tron http接口postman
接口把官方文档中的所有http接口整理成了postman的形式,方便自己调试使用。
使用http接口的话,需要注意的是,在代码中一个流程就可以完成的事情,在http接口下,需要一步一步执行。
比如创建一笔交易,需要调几次接口:
createtransaction
gettransactionsign
broadcasttransaction
这个和使用 wallet-cli 工具不同的的,wallet-cli 在一次交易构建中,在一次方法内,完成了这三步的操作。
构建交易示例构建一笔交易 createtransaction构建一笔交易,需要拿到返回的结果、加私钥生成签名。
12345{ "to_address": "410932AD502E8AB6CE4B7E0E8D52D78BAA231C00B6", "owner_address": "41AF71E98F91515D7E5D5379837B9EEFD1AB4650D2", "amount": 999900000 ...
tron-产块-SR产块机制
SR 基于DPOS共识,所有节点按照时间顺序轮流产块。
DPOS 共识简述DPOS 共识即为,Delegated Proof of Stake 股份授权证明,在 POS 机制上进行改进。相较于DPOS更为中心化,大白话主要就是两个角色:
持股人(持币用户)投票选举出委托人(Delegates)
被委托人进行出块,将奖励分给投票人
在DPOS机制下,算法要求系统做三件事:
随机指定生产者出场顺序;
必须按顺序产块,不按顺序生产的区块无效;
每过一个周期洗牌一次,打乱原有顺序;
受托人的职责主要有:
保证节点的正常运行;
收集网络里的交易;
节点验证交易,把交易打包到区块;
节点广播区块,其他节点验证后把区块添加到自己的数据库;
带领并促进区块链项目的发展;
大至概念就是这些,下面对SR产块原理进行分析。
产块机制注意,TRON对DPOS的产块机制是做了调整的,不完全是按照这个的机制来实现。这个嘛。。。懂的都懂。
产块大流程
产块节点通过定时任务制每隔最多不超过3秒执行一次,判断是否轮到自己产块
如果是自己产块,回滚当前节点交易状态,并将交易池中的交易打包
打包成功后广播 ...
tron-节点-轻节点搭建
轻节点轻节点,只包含部分数据,节点轻量化,所以叫轻节点,BTC、ETH都支持轻节点功能,在tron网络中轻节点数据,只保留一天的数据,从这一天的数据为起点,同步后续数据。开发一般使用轻节点来进行开发和调试是比较方便的,全量数据需要很大的磁盘空间。
快照快照有全量数据快照和轻节点数据快照。全量数据快照,就是全部的数据,比较大。轻节点数据快照是可以指定某一天的数据快照。
看下单天的数据量很小,只有10G,全量数据就比较大,有442G:
搭建搭建看之前的搭建方式: FullNode搭建,唯一的区别在于,FullNode并没有指定数据快照,从零开同步,轻节点或全量节点,是指定的数据快照,这样就不需从零开始同步。
项目结构:
123FullNode.jarconfig.confoutput-directory
启动:
1java -jar FullNode.jar -c config.conf -d output-directory
优化参数自行指定,这里只说怎么启动轻节点。还有一点,轻节点默认不启用查询功能,需要在config.conf中修改参数
1openHistoryQueryWh ...
tron-节点-SR单节点搭建
波场的产块节点称为 Supper Node,官方文档称之为SR。
波场使用DPOS共识算法,这个算法的特点是并不基于算力,而是基于股权证明来实现共识和产块。DPOS共识算法后面会专门讲到一期。
Supper Node(SR)以下称Supper Node 为SR,官方SR节点为产块节点,共有27个SR节点。这27个SR节点每隔3秒轮流负责产块,注意是轮流产块,即:节点A产块-->节点B产块...依次类推。这种产块方式相较于POW的共识,更加的节能省电,但是缺点也很明显,就是节点理论是更容易被控制作恶,只要半数节点被控制或者半数节点掌握在某个团队中,对于社区来说,并不为是一件好事,缺乏透明度。
成为 SR 的好处是,SR负责产块,产块后会获得产块奖励,SR可以产块后,再将奖励分发给投票者。
产块超级代表产块者由所有用户投票,得票最多的128个超级代表成员中选出27个进行产块,实际官方的27个产块SR是在配置文件中写死的。这27个SR节点即为产块者,如果其中一个节点挂掉后,会从超级代表中的成员节点顶上,继续进行产块。
如何产块27个SR节点,分别进行产块。27个节点分属于不同的机器 ...
tron-交易-交易构建
构建区块链当中要发起一笔交易,需要考虑更多的是这笔交易的安全性。在分布式、去中心化的环境当中,如何保证交易的安全性?需要考虑几个问题:
如何保证交易正确性
交易不可篡改
非中心化场景下,交易的验证
构建TRX转账交易构建交易需要最重要的东西就是私钥。需要了解TRON的ECKey的使用,tron ECC使用及项目中的应用
这里假设,你已经有了一套TRON的账户,包括:私钥、base58Check地址、公钥等。如果在图形界面操作的话,完全不需要理解它的原理,这里说的是它在代码中是如何构建出一笔交易的。构建交易需要跟FullNode产生交互。
需要准备好:
测试用的私钥
owner的地址
to的地址
实现构建一笔交易,需要以下步骤:
构建交易protobuf
生成签名
发送交易
tron 链使用的是protobuf进行序列化和反序列人。如果是在测试阶段完全可以自己搭一个FullNode进行测试。
构建交易protobuf交易在本地构建后,最终是需要广播到链上,需要经过网络传输。所以需要序列化。
123456789101112131415161718public Transacti ...
tron-节点-FullNode节点启动
简述tron 有三种节点类型:
SuperNode:负责生产区块。tron链是DPOS共识,只有27个SR能够产块。
FullNode: 节点负责广播区块,不进行产块,网络中的FullNode转发区块、广播区块。
SolidityNode: 该节点类型已经合并为其它两种节点类型,不会单独运行或部署,所以不再单独部署。
环境准备保证以下环境正常使用
JDK 1.8
注意不能高于或低于1.8版本,否则会有问题
FullNode.jar
启动节点项目的启动方式:
官方脚本启动
手动指定参数启动
docker 启动
脚本方式这种方式最简单,不过一般使用区块链的开发者都需要debug代码,所以一般在部署的时候使用脚本启动。需要用到的文件,都可以从 java-tron 这个项目中获得。
1234git clone https://github.com/tronprotocol/java-tron.gitcd java-trongit checkout -t origin/master./gradlew build -x test
gradlew是在java-tron项目中的gra ...