TRON 开发者入门完全指南

当前位置:首页 > 币圈百科 > TRON 开发者入门完全指南

TRON 开发者入门完全指南

2023-01-21币圈百科704

为了让开发者更清楚的使用TRON主网,TRON社区成员特此为TRON开发者做了一个完整的入门指南,如下:TRON,2017年9月做了一个1000万美元级别的1CO,2018年6月上线。官方数据显示,截至目前,主网已注册账号69万个,每天新增账号蓑衣网小编20222万多个。同时TRON支持每秒几千tps,ETH还在十tps的量级。不可否认,eth聚集了很多有才华的开发者和研究者,但是eth的PoW共识机制决定了它无法在短时间内解决交易费用高、交易确认速度和并发交易的限制。目前TRON在合约和交易经验上比ETH有很大优势。同时,在用户准入门槛和合约开发门槛方面,TRON也比EOS有显著优势,因为TRON的新用户几乎不需要成本(相比EOS复杂的邀请机制)而且它支持solidtiy的TVM(相比EOS用C进行合约开发)。对于DApp开发者来说,TRON一定是现阶段值得关注的公链。基于其性能和生态,已经出现了很多用户量和交易量都很大的DApp,在这条公链上有足够的机会诞生爆款DApp。但是在TRON公链生态中,针对开发者的指导性文章很少,高质量的文章也很少,这也是我写这篇入门教程的初衷。在下一章中,我们将正式开始介绍基于TRON的DApp开发的基本概念,以及一个帮助您快速入门的示例。

TRON开发工具链

TRON提供完整的工具链,为开发者提供合约开发、测试、部署和接口。特别是对于熟悉以太坊智能合约的开发者来说,必须非常熟悉语言和工具。Tron-Web: 蓑衣网小编2022 JavaScript接口,用于提供常用的账户、地址、转账和合同相关操作。相当于以太坊的web3js。Tron-box:用于合同编译、部署和测试的命令行工具。它相当于以太坊的松露工具链。Tronlink,tronPay:提供浏览器环境的钱包插件,为dapp提供便捷安全的执行环境,相当于以太坊的MetaMask,Scatter。Tron-grid:社区维护的主网和测试网之间的HTTP API接口,相当于以太坊社区中的Infura。Tron-Studio: Tron集成开发环境,相当于以太坊里的Remix,但是现在功能和稳定性还有待提高,不推荐。

全流程教程

在本章中,我们通过一个Token契约来解释基本的契约开发和dapp开发流程。这个例子中的所有代码都可以在这个Repo中找到。

环境构建

如果要构建本地私有链进行调试。根据官方文档,TRON的私有链可以通过官方docker镜像进行部署。以下是部署说明:Docker Run-IT \-p 8091:8091-p 8092:8092-p 8090:8090-p 50051:50051-p 50052:50052 \-RM-Name tron tron Tools/quick start:Latest

运行结果如下。如您所见,已经在本地生成了10个可用于测试的TRX账户地址。

认真的读者可能已经发现,当我们开始镜像时,总共要设置五个端口,这比以太坊和比特币的RPC接口要多得多。其中,TRON自身的节点是有区别的,这一点我们作为开发者需要了解。在TRON网络中,有四种节点:见证:作为超级节点,负责收集网络中的事务,释放块,不为客户端公开API。全节点:全节点广播事务和块,同时为提供的API查询和操作账户、事务和块。在本例中,端口8090是其HTTP接口,端口50051是其GRPC接口。Solidity node: Solidity node只负责从FullNodo拉块数据,不会主动发送数据。它的块数据滞后于FullNode的几个块,所以它公开的API适合确认的事务。客户端需要链接FullNode和SolidityNode来获得不同的API函数。具体API列表在这里。在本例中,端口8091是其HTTP接口,端口50052是其GRPC接口。 事件服务器:在创的合约中,像Ehereum一样支持事件,不同的是创中的事件是从事件服务器中来监听。在本例中,端口8092为其超文本传送协议接口。同时,社区提供了沙士达山(美国加州北部山脉)测试网,用户也可以方便的输入自己地址来获取测试代币,同时提供测试网的区块链浏览器,非常方便开发调试,由于创测试网速度比以太坊的快非常多,我们在开发测试中,本教程直接使用测试网进行调试和部署,以简化读者的操作和学习路径

合约编写

电子中的合约采用固态来编写,故以太坊开发者在合约开发层,可以零学习成本迁移至创网络。下面我们编写一个标准的ERC20的代币转移合约,并将其部署至创。

pragma solidity ^0.4.18;约定令牌{ uint 256常量私有MAX _ uint 256=2 * * 256-1;映射(地址=uint256)公共余额;映射(address=mapping(address=uint 256))公共允许;/*注意:以下变量是可选的虚数。人们不必包括它们。它们允许用户在不影响核心功能的情况下定制令牌合约。一些钱包/界面可能甚至懒得看这些信息. string字符串公共名称;//花里胡哨的名字:例如西蒙雄鹿uint8公小数;//显示多少位小数。字符串公共符号;//一个标识符:例如SBX函数Token( uint256 _initialAmount,string _tokenName,uint8 _decimalUnits,string _ Token symbol)public { balances[msg。sender]=_ initial mount;//给创建者所有初始令牌totalSupply=_ initialAmount//更新总供应名称=_ tokenName//设置用于显示目的的名称decimals=_ decimalUnits//用于显示目的的小数位数symbol=_ tokenSymbol//设置用于显示目的的符号}函数传递(地址_收件人,uint256 _值)公共返回(bool成功){ require(balances[msg。发件人]=_ value);余额[消息。发件人]-=_ value;余额[_ to]=_ value;发出传送(msg.sender,_to,_ value);//solhint-disable-line indent,no-used-vars返回真实}函数transferFrom(address _from,address _to,uint 256 _ value)public returns(bool success){ uint 256 allow ance=allowed[_ from][msg。发件人];要求(余额[_from]=_value折让=_ value);余额[_ to]=_ value;余额[_ from]-=_ value;if(allow ment MAX _ uint 256){ allowed[_ from][msg。发件人]-=_ value;}发出传送(_from,_to,_ value);//solhint-disable-line indent,no-used-vars返回true}函数balance of(address _ owner)public view returns(uint 256 balance){ return balances[_ owner];}函数approve(address _spender,uint 256 _ value)公共返回(bool成功){ allowed[msg。sender][_ spender]=_ value;发出批准(消息发送者,_花费者,_价值);//solhint-disable-line indent,no-used-vars返回真实}函数津贴(地址_所有者,地址_支出者)公共视图返回(uint256剩余){允许返回[_ owner][_ spender];}}

合约部署

合约代码完成后,我们新建一个目录,利用tronbox来初始化一个基础的DApp工程NPM install-g tronbox tronbox initls

我们可以看到,路径下已经生成了合约样板工程

为了部署合约,我们首先下载一个tronPay插件来创建我们的创账户地址(要求铬浏览器),之后导出私钥。

打开路径中的tronbox.js,粘贴它,用你自己的替换私钥。其他参数如上所述用于不同节点的功能。我们需要分别配置节点的API路径:

模块。exports={ networks:{ Shasta:{ private key:'您的私钥'consume _ user _ resource _ percent:30,fee_limit: 100000000,full node:' https://API . Shasta . tron grid . io 'solidity node:' https://API . Shasta . tron grid . io 'event server:' https://API . Shasta . tron grid . io 'network_id: '* '} };

最后,我们在迁移文件夹中创建一个名为2_deploy_contracts.js的部署脚本,其功能与truffle中的迁移脚本完全相同。

var token=artifacts . require('/token . sol ');module . exports=function(deployer){ deployer . deploy(token,1000000,' GUIDE '6,' GD ');};

现在,我们可以完成合同部署了。

tron box migrate-Network Shasta

此时,已经可以在块浏览器中找到该合同。在接下来的章节中,我们将解释如何使用dapp与契约进行交互。

集成TronLink,TronPay

TronLink,TronPay的实现原理是在加载dapp之前将tronweb对象注入浏览器的全局对象中,所以作为dapp开发者,我们需要实现的逻辑是等待tronWeb加载之后再进行tronWeb相关的调用。正如代码中提到的,当没有检测到浏览器环境中注入的tronWeb对象时,我们需要阻止应用程序加载并等待。

从“React”导入React;从“react-dom”导入ReactDOM“导入”。/index . CSS '从'导入应用程序。/App 'Var等待global=async()={//1 . check variable,并检查tronweb是否加载了if (window。Tronweb) {let Tronweb=window。Tronweb//2.检查节点连接,检查是否所有需要的API都可以用const nodes=Await tron web . is connected()连接;const connected=!对象.条目(节点)。地图(([名称,connected]) => { if (!connected) { console.error(`Error: ${name} is not connected`); } return connected; }).includes(false); if (connected){ // 3. 如果一切正常,启动react应用。 ReactDOM.render(, document.getElementById('root')); } else { console.error(`Error: TRON node is not connected`); console.error('wait for tronLink'); setTimeout(async () => { await waitForGlobal(); }, 100); } } else { // 如果检测到没有注入tronWeb对象,则等待100ms后重新检测 console.error('wait for tronLink'); setTimeout(async () => { await waitForGlobal(); }, 100); }};waitForGlobal().then();

合约和交易

合约调用在tronWeb中略有不同,下面我们分几个场景来分别说明:1. 查询当前用户trx余额:

let tronWeb = window.tronWeb;

this.state.address && (this.setState({balance : await tronWeb.trx.getBalance(this.address)}));

2. 发起交易,转账trx

let tronWeb = window.tronWeb;

const sendTransaction = await tronWeb.trx.sendTransaction("TKPzfsXRaDmdKh2GuouXw2eyK2HNH9FNQS", 1000);

3. 构造合约并查询当前的token余额

import * as artifact from './contracts/Token'

let tronWeb = window.tronWeb; let address = tronWeb.address.fromHex(artifact.networks['*'].address); this.contract = tronWeb.contract(artifact.abi, address); this.state.address && this.contract.balances(this.state.address).call().then(output => { console.group('Contract "call" result'); console.log('- Output:', output, '\n'); this.setState({tokenBalance: output.toString()}); console.groupEnd(); });

4. 对token进行转账

// 2. send token let tx = this.contract.transfer("TKPzfsXRaDmdKh2GuouXw2eyK2HNH9FNQS", 100).send().then(output => { console.group('Contract "getLast" result'); console.log('- Output:', output, '\n'); console.groupEnd(); });

5. 监听链上Transfer事件

this.contract && this.contract.Transfer().watch((err, event) => {

if(err) return console.error('Error with "Message" event:', err); console.group('New event received'); console.log('- Contract Address:', event.contract); console.log('- Event Name:', event.name); console.log('- Transaction:', event.transaction); console.log('- Block number:', event.block); console.log('- Result:', event.result, '\n'); console.groupEnd(); });

以上几个case包含了所有主要的dapp与智能合约的交互逻辑,在实际使用中,基本也可以涵盖大部分场景,更多的用法由于TronWeb文档的暂时不完善,读者可以尝试看一点源码,并不是非常复杂,更多的问题也期待与作者交流讨论。

总结

以上通过讲解一个Token合约的dapp开发全流程,我们讲解了合约编写,合约部署,dapp集成,dapp与合约交互,本文章所有代码均开源,欢迎读者star。并在每一个章节突出了从开发者角度需要关注的重点,并与以太坊开发进行了类比和关联。总体上来说,如果dapp开发者熟悉以太坊生态的开发,迁移至TRON生态的学习成本和现有代码的迁移成本都非常低。欢迎大家拥抱TRON生态,也请读者期待下一期教程《TRON开发者入门2:带宽,能量为什么对Dapp开发者如此重要?》。

TRON 开发者入门完全指南 | 分享给朋友: