产品简介 官网：https://dashboard.trustivon.com/ Trustivon Validator 是一个功能强大的区块链验证者管理平台，专为 Trustivon 网络设计，提供直观、安全、高效的验证者节点管理和委托服务。该平台采用现代化的技术栈构建，支持多语言、响应式设计，适配各种设备，为用户提供最佳的使用体验。 核心功能 1. 验证者列表管理 实时展示网络中的所有验证者节点 显示验证者的关键信息：地址、佣金率、总质押量、个人质押量、状态 支持按不同状态筛选验证者（活跃、挖矿） 响应式设计，适配桌面和移动设备 2. 委托管理 一键委托 TC 代币给验证者 支持取消委托操作 提供重新委托功能，方便用户在不同验证者之间转移质押 实时显示可委托余额和可用奖励 3. 奖励领取 支持领取委托奖励 显示待处理的解除绑定记录 提供解除绑定周期倒计时 一键发起奖励领取 4. 验证者详情 查看验证者的详细信息 显示验证者的投票地址 支持复制验证者地址 提供验证者的状态变化历史 5. MetaMask 集成 无缝连接 MetaMask 钱包 支持钱包地址显示和管理 安全的交易签名机制 实时监听钱包状态变化 6. 多语言支持 支持英文、繁体中文、日文三种语言 动态语言切换 本地化的用户界面 使用指南 1. 连接钱包 点击右上角的"连接钱包"按钮 在弹出的MetaMask窗口中确认连接 连接成功后，右上角会显示您的钱包地址 2. 委托操作 在验证者列表中选择一个验证者 点击"委托"按钮 输入委托金额 确认委托设置 在MetaMask中确认交易 3. 领取奖励 点击"领取奖励"按钮 查看可领取的奖励金额 确认领取操作 在MetaMask中确认交易 4. 管理委托 在验证者列表中找到您已委托的验证者 可以选择"取消委托"或"重新委托" 按照提示完成操作 优势和亮点 1. 安全性 基于MetaMask SDK的安全连接 所有交易都在用户钱包中签名 不存储用户的私钥或助记词 采用HTTPS协议传输数据 2. 用户体验 直观的界面设计，易于使用 响应式布局，适配各种设备 实时数据更新，提供最新信息 多语言支持，服务全球用户 3. 功能完整性 涵盖验证者管理的全生命周期 支持委托、取消委托、重新委托 提供奖励领取功能 详细的验证者信息展示 4. 技术先进性 采用现代化的技术栈 组件化架构，便于扩展和维护 类型安全的代码设计 优秀的性能表现 未来规划 支持更多网络 ：计划支持主网和更多测试网络 增强数据分析 ：提供更详细的验证者性能分析和统计 移动应用开发 ：推出iOS和Android移动应用 增强安全性 ：添加更多安全验证和提示 社区功能 ：支持验证者和委托者之间的交流 更多语言支持 ：添加更多语言选项 如何开始使用 访问 Trustivon Validator 平台 连接您的MetaMask钱包 浏览验证者列表，选择合适的验证者 开始您的委托之旅 系统要求 现代浏览器（Chrome、Firefox、Safari、Edge） 已安装MetaMask扩展 稳定的网络连接 少量TC代币用于支付交易手续费 结语 Trustivon Validator 平台为用户提供了一个安全、高效、易用的验证者管理工具，帮助用户更好地参与Trustivon网络的治理和质押。无论您是经验丰富的区块链用户还是初学者，都能轻松上手使用该平台。 加入 Trustivon Validator 生态，共同构建更安全、更高效的区块链网络！
dApp开发入门教程：从零开始构建链上留言板
1. 什么是dApp？ dApp（去中心化应用）是基于区块链技术构建的应用程序，与传统应用的主要区别在于： 去中心化：数据存储在区块链上，不依赖单一服务器 透明公开：智能合约代码和数据对所有人可见 用户控制：用户完全控制自己的数据和资产 无需信任：通过智能合约自动执行，无需第三方中介 本教程将指导你从零开始构建一个完整的dApp——链上留言板，让你掌握dApp开发的核心流程。 2. 开发环境搭建 2.1 安装Node.js dApp开发需要Node.js环境，推荐使用LTS版本： 访问 Node.js官网 下载并安装适合你操作系统的LTS版本 验证安装：node -v npm -v 2.2 安装MetaMask MetaMask是连接dApp和区块链的桥梁： 访问 MetaMask官网 下载并安装浏览器插件 创建钱包并保存助记词 添加Trustivon测试网络（参考MetaMask网络设置） 2.3 获取测试代币 在Trustivon测试网上开发需要测试代币： 访问 Trustivon水龙头 输入你的MetaMask地址 领取测试代币 3. 智能合约开发 3.1 初始化Hardhat项目 Hardhat是以太坊智能合约开发的流行框架： 创建项目目录： mkdir doomsday-dapp cd doomsday-dapp 初始化npm项目： npm init -y 安装Hardhat： npm install --save-dev hardhat 初始化Hardhat项目： npx hardhat init 选择"Create a TypeScript project" 按默认选项完成初始化 安装依赖： npm install --save-dev @nomicfoundation/hardhat-toolbox npm install dotenv 3.2 编写智能合约 创建一个简单的链上留言板合约： 创建合约文件： mkdir -p contracts touch contracts/MessageBoard.sol 编写合约代码： // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; contract MessageBoard { struct Message { string content; address sender; uint256 bidAmount; uint256 timestamp; bytes32 messageId; } Message[] public messages; uint256 public constant MAX_MESSAGES = 100; uint256 public constant DECAY_INTERVAL = 24 hours; // 衰减间隔：24小时 uint256 public constant DECAY_RATE = 50; // 衰减率：50% uint256 public lastMessageTimestamp; // 最后一条留言的时间戳 event MessageAdded( bytes32 messageId, string content, address sender, uint256 bidAmount, uint256 timestamp ); /** * @dev 获取当前能进入前100名的最低竞价 * @return 最低竞价金额，如果留言数量不足100，则返回0 */ function getMinimumBidForTop100() public view returns (uint256) { if (messages.length < MAX_MESSAGES) { // 如果留言数量不足100，任何大于0的竞价都能进入前100 return 0; } // 获取第100条留言的原始竞价 uint256 originalBid = messages[MAX_MESSAGES - 1].bidAmount; // 如果最后一条留言时间为0，说明还没有留言，返回0 if (lastMessageTimestamp == 0) { return originalBid; } // 计算自最后一条留言以来经过的时间 uint256 timeElapsed = block.timestamp - lastMessageTimestamp; // 如果经过的时间小于衰减间隔，返回原始竞价 if (timeElapsed < DECAY_INTERVAL) { return originalBid; } // 计算经过了多少个衰减周期 uint256 decayPeriods = timeElapsed / DECAY_INTERVAL; // 计算衰减后的竞价 uint256 decayedBid = originalBid; for (uint256 i = 0; i < decayPeriods; i++) { // 每次衰减50% decayedBid = decayedBid * (100 - DECAY_RATE) / 100; // 防止衰减到0以下 if (decayedBid == 0) { break; } } return decayedBid; } function addMessage(string calldata _content, bytes32 _messageId) external payable { require(msg.value > 0, "Bid amount must be greater than 0"); // 检查当前竞价是否大于等于进入前100名的最低竞价 uint256 minimumBid = getMinimumBidForTop100(); require(msg.value > minimumBid, "Bid amount must be greater than the current minimum bid for top 100"); Message memory newMessage = Message({ content: _content, sender: msg.sender, bidAmount: msg.value, timestamp: block.timestamp, messageId: _messageId }); // 插入排序，按竞价金额降序 uint256 i = messages.length; messages.push(newMessage); while (i > 0 && messages[i - 1].bidAmount < newMessage.bidAmount) { messages[i] = messages[i - 1]; i--; } if (i != messages.length - 1) { messages[i] = newMessage; } // 只保留前100条留言 if (messages.length > MAX_MESSAGES) { messages.pop(); } // 更新最后一条留言的时间戳 lastMessageTimestamp = block.timestamp; emit MessageAdded( _messageId, _content, msg.sender, msg.value, block.timestamp ); } function getMessages() external view returns (Message[] memory) { return messages; } /** * @dev 分页获取留言 * @param _page 页码，从1开始 * @param _pageSize 每页数量 * @return 分页后的留言数组 */ function getMessagesPaginated(uint256 _page, uint256 _pageSize) external view returns (Message[] memory) { require(_page > 0, "Page must be greater than 0"); require(_pageSize > 0, "Page size must be greater than 0"); uint256 totalMessages = messages.length; uint256 startIndex = (_page - 1) * _pageSize; // 如果起始索引大于等于总留言数，返回空数组 if (startIndex >= totalMessages) { return new Message[](0); } // 计算结束索引 uint256 endIndex = startIndex + _pageSize; if (endIndex > totalMessages) { endIndex = totalMessages; } // 创建结果数组 uint256 resultSize = endIndex - startIndex; Message[] memory result = new Message[](resultSize); // 填充结果数组 for (uint256 i = 0; i < resultSize; i++) { result[i] = messages[startIndex + i]; } return result; } function getMessageCount() external view returns (uint256) { return messages.length; } // 允许合约接收ETH receive() external payable {} // 允许合约接收ETH（当调用不存在的函数时） fallback() external payable {} } 3.3 编译和测试合约 编译合约： npx hardhat compile 编写测试文件： mkdir -p test touch test/MessageBoard.test.js 编写测试代码： const { expect } = require("chai"); const { ethers } = require("hardhat"); describe("MessageBoard", function () { let MessageBoard; let messageBoard; let owner; let addr1; beforeEach(async function () { [owner, addr1] = await ethers.getSigners(); MessageBoard = await ethers.getContractFactory("MessageBoard"); messageBoard = await MessageBoard.deploy(); await messageBoard.deployed(); }); it("Should add a message", async function () { const content = "Hello, Trustivon!"; const messageId = ethers.utils.formatBytes32String("test-1"); const bidAmount = ethers.utils.parseEther("0.1"); await expect( messageBoard.addMessage(content, messageId, { value: bidAmount }) ) .to.emit(messageBoard, "MessageAdded") .withArgs(messageId, content, owner.address, bidAmount, expect.any(BigInt)); const messages = await messageBoard.getMessages(); expect(messages.length).to.equal(1); expect(messages[0].content).to.equal(content); expect(messages[0].sender).to.equal(owner.address); }); }); 运行测试： npx hardhat test 3.4 部署合约 创建部署脚本： mkdir -p scripts touch scripts/deploy.js 编写部署代码： const { ethers } = require("hardhat"); async function main() { const [deployer] = await ethers.getSigners(); console.log("Deploying contracts with the account:", deployer.address); console.log("Account balance:", (await deployer.getBalance()).toString()); const MessageBoard = await ethers.getContractFactory("MessageBoard"); const messageBoard = await MessageBoard.deploy(); await messageBoard.deployed(); console.log("MessageBoard contract deployed to:", messageBoard.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); 配置Trustivon网络： 创建.env文件：touch .env 添加配置：PRIVATE_KEY=your-private-key TRUSTIVON_RPC_URL=https://rpc.trustivon.com 修改hardhat.config.js，添加Trustivon网络配置 部署合约到Trustivon测试网： npx hardhat run scripts/deploy.js --network trustivon 4. 前端开发 4.1 初始化React项目 创建前端目录： npx create-react-app frontend cd frontend npm install web3 @web3-react/core @web3-react/injected-connector 创建合约ABI目录： mkdir -p src/contracts 复制合约ABI： cp ../artifacts/contracts/MessageBoard.sol/MessageBoard.json src/contracts/ 4.2 编写前端代码 创建Web3连接组件： mkdir -p src/components touch src/components/Web3Provider.js 编写Web3连接代码： import React, { createContext, useContext, useEffect, useState } from 'react'; import { InjectedConnector } from '@web3-react/injected-connector'; import Web3 from 'web3'; const Web3Context = createContext(); export const useWeb3 = () => useContext(Web3Context); export const Web3Provider = ({ children }) => { const [web3, setWeb3] = useState(null); const [account, setAccount] = useState(null); const [networkId, setNetworkId] = useState(null); const [loading, setLoading] = useState(true); const connector = new InjectedConnector({ supportedChainIds: [19478], // Trustivon测试网链ID }); const connectWallet = async () => { try { const accounts = await connector.activate(); setAccount(accounts[0]); } catch (error) { console.error('Failed to connect wallet:', error); } }; useEffect(() => { const initWeb3 = async () => { try { if (window.ethereum) { const web3Instance = new Web3(window.ethereum); setWeb3(web3Instance); const network = await web3Instance.eth.net.getId(); setNetworkId(network); const accounts = await web3Instance.eth.getAccounts(); if (accounts.length > 0) { setAccount(accounts[0]); } } } catch (error) { console.error('Failed to initialize Web3:', error); } finally { setLoading(false); } }; initWeb3(); // 监听账户变化 window.ethereum?.on('accountsChanged', (accounts) => { setAccount(accounts[0]); }); // 监听网络变化 window.ethereum?.on('chainChanged', (chainId) => { setNetworkId(parseInt(chainId, 16)); }); }, []); const value = { web3, account, networkId, loading, connectWallet, }; return <Web3Context.Provider value={value}>{children}</Web3Context.Provider>; }; 创建留言板组件： touch src/components/MessageBoard.js 编写留言板代码： import React, { useState, useEffect } from 'react'; import { useWeb3 } from './Web3Provider'; import contractABI from '../contracts/MessageBoard.json'; const CONTRACT_ADDRESS = 'your-contract-address'; // 替换为你的合约地址 const MessageBoard = () => { const { web3, account, connectWallet } = useWeb3(); const [messages, setMessages] = useState([]); const [content, setContent] = useState(''); const [bidAmount, setBidAmount] = useState('0.1'); const [loading, setLoading] = useState(false); const contract = web3 && new web3.eth.Contract(contractABI.abi, CONTRACT_ADDRESS); const fetchMessages = async () => { if (!contract) return; try { const result = await contract.methods.getMessages().call(); setMessages(result); } catch (error) { console.error('Failed to fetch messages:', error); } }; useEffect(() => { fetchMessages(); }, [contract]); const addMessage = async (e) => { e.preventDefault(); if (!contract || !account) return; setLoading(true); try { const messageId = web3.utils.sha3(Date.now().toString()); const value = web3.utils.toWei(bidAmount, 'ether'); await contract.methods .addMessage(content, messageId) .send({ from: account, value }); setContent(''); setBidAmount('0.1'); fetchMessages(); } catch (error) { console.error('Failed to add message:', error); } finally { setLoading(false); } }; if (!account) { return ( Connect Wallet ); } return ( 链上留言板 留言内容 setContent(e.target.value)} className="w-full p-2 border border-gray-300 rounded" rows="3" required /> 竞价金额 (TC) setBidAmount(e.target.value)} className="w-full p-2 border border-gray-300 rounded" step="0.1" min="0.1" required /> {loading ? '提交中...' : '提交留言'} 留言列表 {messages.length === 0 ? ( 暂无留言 ) : ( messages.map((msg, index) => ( {msg.sender} {new Date(msg.timestamp * 1000).toLocaleString()} {msg.content} 竞价: {web3.utils.fromWei(msg.bidAmount, 'ether')} TC )) )} ); }; export default MessageBoard; 更新App.js： import React from 'react'; import './App.css'; import { Web3Provider } from './components/Web3Provider'; import MessageBoard from './components/MessageBoard'; function App() { return ( <MessageBoard /> ); } export default App; 4.3 运行前端应用 启动前端开发服务器： npm start 在浏览器中访问 http://localhost:3000 连接MetaMask钱包 测试留言功能： 输入留言内容 设置竞价金额 提交留言 查看留言列表 5. 部署和上线 5.1 构建前端应用 构建生产版本： npm run build 部署到静态网站托管服务（如Vercel、Netlify等） 5.2 验证和测试 在浏览器中访问部署后的网站 测试所有功能 确保与MetaMask正常交互 检查交易是否正确上链 6. 总结和扩展 6.1 开发总结 通过本教程，你已经学会了： 搭建dApp开发环境 编写和部署智能合约 开发React前端应用 连接Web3和MetaMask 与智能合约交互 6.2 扩展建议 你可以进一步扩展这个dApp： 添加用户认证和个人中心 实现留言编辑和删除功能 添加留言点赞和评论功能 实现留言搜索和筛选 添加链上身份验证 优化前端UI/UX设计 6.3 学习资源 Solidity官方文档 Hardhat文档 Web3.js文档 React官方文档 MetaMask文档 7. 常见问题 7.1 无法连接MetaMask 确保MetaMask已安装并解锁 确保已添加Trustivon测试网络 刷新页面后重试 7.2 交易失败 确保钱包中有足够的测试代币 检查Gas费用设置 查看MetaMask交易记录中的错误信息 7.3 留言不显示 检查合约地址是否正确 确保网络连接正常 刷新页面后重试 8. 社区支持 Trustivon GitHub Trustivon官方网站 Trustivon开发者文档 Telegram技术支持 恭喜你完成了第一个dApp的开发！继续学习和探索，你将能够构建更复杂和强大的去中心化应用。 线上预览：https://eternal.trustivon.com/ GitHub开源：https://github.com/Trustivon/eternal-message-dapp
你的链还没上 Chainlist？这里有个更快、更好用的替代方案
有没有觉得，当你发现一条新的公链、或者某个新的侧链生态时，想把它添加到你的 MetaMask 钱包里，却总是面临一个令人抓狂的困境？ 你满怀期待地打开 Chainlist 官方网站，输入链名、查询链ID，结果却是：查无此链，或者只有过时的信息。 官方更新慢、付费加速，我们受够了！ 官方 Chainlist 作为一个公共资源固然好，但它的更新速度简直让人焦虑。想添加一条新链？ 提交信息：开发者提交新链信息。 漫长等待：官方审核流程长得像在走迷宫。 甚至付费：有时为了加快审核，居然还需要付费（这操作是不是有点…）。 最终结果就是：新链早就运行起来了，但你却因为钱包里没有配置，只能干瞪眼。 这种信息滞后，不仅影响你的体验，更可能让你错过最佳的参与时机。 用户痛点升级： 你还在手动填写那些复杂的参数吗？ 想象一下这个场景：你终于在某个角落找到了新链的参数信息。 你打开 MetaMask，点击“添加网络” → “自定义网络”，然后面对一堆参数格：网络名称、新的 RPC URL、链 ID、货币符号、区块浏览器 URL… 你得小心翼翼地复制、粘贴、核对，生怕输错一个数字导致交易失败。整个过程冗长、繁琐，而且极易出错！ 别等了！你的私藏加速站来了：https://chainlist.trustivon.com/ 现在，我们有了更好的选择——由 trustivon 维护和运营的 Chainlist。 我们的目标很简单：让链信息更新变得更快、更及时、更贴心，彻底告别手动配置的噩梦，而且对用户和开发者完全免费！ 如何体验“丝滑”的链添加过程？（告别复制粘贴！） 你只需要记住一个地址：https://chainlist.trustivon.com/。 当你需要添加任何新的 EVM 兼容链时，请试试这个流程，只需要点击两下鼠标： 打开 https://chainlist.trustivon.com/ 在搜索框中输入链名、链 ID 或关键词进行搜索。 找到对应的链后，先点击 “Connect Wallet”（连接钱包），然后点击 “Add To MetaMask”（添加到 MetaMask）。 搞定！ MetaMask 会自动弹出窗口，询问你是否确认添加这些网络参数。你只需要确认，无需手动输入任何一行代码或数字。 整个过程秒级完成！因为我们承诺，对于新提交的链信息，trustivon 会以最快的速度进行审核和上线，不会收取任何额外的“加速费”，让你随时掌握最新的链生态。 不只是一个“更快”的Chainlist，我们还提供定制服务 对于大部分用户来说，上面提到的快速查询和添加功能就已经足够完美了。 但如果你是： 一条新的公链/侧链项目的开发者； 正在构建一个需要集成特定私有链信息的企业； 需要将自己项目的测试网或预发布链信息快速集成到工具中； 你可能需要的不仅仅是简单的信息展示，而是更深层次的、定制化的服务。 这时，你可以直接联系 trustivon 团队。我们拥有维护 Chainlist 的技术和经验，可以为你提供新链定制、数据源集成、链信息批量管理等专业的服务定制。 简而言之： 如果你的需求已经超出了“查-看-加”的范畴，需要专属的解决方案，找我们就对了！ 总结：你的链信息，应该由你掌控速度！ 告别官方 Chainlist 的缓慢和付费陷阱，告别手动输入参数的繁琐和错误。将 https://chainlist.trustivon.com/ 加入你的收藏夹，让它成为你探索新链世界的第一站。 立即体验： https://chainlist.trustivon.com/ 有定制需求？ 欢迎随时联系 trustivon 团队，我们期待为你服务！
告别选择困境，拥抱定制未来！搭建企业级EVM公链，Trustivon是您的终极答案！
在数字化转型浪潮中，搭建一条高效、安全、可定制的区块链基础设施，是企业抢占先机的关键。许多企业在面对主流公链（如以太坊、Solana）时，往往陷入抉择的泥潭： 直接使用主流公链？ 意味着高昂的Gas费、不可控的升级、有限的治理权，以及无法深度定制的业务逻辑。 硬性分叉（Fork）现有公链？ 以太坊等成熟公链的代码复杂度和技术维护门槛极高，需要顶尖的专业团队和巨大的时间投入，难度堪比登天。 面对这一挑战，睿智的企业决策者会发现：定制化部署一条EVM兼容的专属公链，才是兼顾性能、成本和未来发展最合适的道路。 为什么专属EVM公链是最佳选择？ 在对比了市面上众多方案后，我们深知您选择EVM兼容且自主部署的原因： 高度兼容性，生态无缝迁移： 完全兼容以太坊EVM，让您能利用成熟的Solidity语言和现有Truffle、Hardhat等开发工具，实现现有生态应用的无缝迁移。 绝对控制权，深度定制业务： 拥有自己的公链，意味着您可以从共识算法、可扩展架构等方面进行深度定制，确保底层技术完美贴合您的金融、供应链、游戏等行业需求。 长期成本效益： 初期投入看似更高，但长期来看，可以有效避免高昂的交易费用，实现更灵活的成本效益，加速项目落地，提升投资回报率。 放弃自建/硬Fork，选择Trustivon的理由！ 当决定自建公链时，我们深知您需要的是一个具备专业性、成熟度、以及全方位服务的合作伙伴。在对比了多家区块链解决方案提供商后，您选择Trustivon是基于我们十年以上区块链开发经验的专业技术团队和已在多个行业成功落地的成熟解决方案。 客户的亲身体验：Trustivon的专业与安全 专业的技术能力，交付迅速： Trustivon的团队不仅精通区块链底层技术，更提供从技术咨询、架构设计到开发实施、运维支持的端到端服务保障。我们能确保高性能、高可用的企业级全节点服务的快速部署。 极致的安全保障： 我们将安全放在首位。通过采用多重加密算法和优化的共识机制，结合全面安全审计服务，确保您的资产和数据安全无虞。 完善的开发者生态支持： 从详细技术文档、多语言SDK到兼容主流开发框架的开发工具集成，Trustivon提供24/7技术支持，让您的开发团队毫无后顾之忧。 客户案例证明： 我们已成功为多家金融科技公司构建高性能区块链基础设施，支持日均数百万笔交易处理。我们的方案是经受市场验证的成熟之选！ 结论：有公链需求，直接找Trustivon！ 无需在复杂的公链选择和艰巨的自研/硬Fork中徘徊。如果您有志于搭建一条： 高性能、高安全的专属EVM公链。 需要深度定制以服务您的金融、供应链或游戏等垂直行业。 渴望降低开发门槛并拥有全方位技术支持。 Trustivon提供整套完善的解决方案，是您实现区块链雄心的最佳合作伙伴。 联系我们，为您的业务注入新的增长动力！ 官方网站：https://trustivon.com 商务合作 Email: admin@trustivon.com Telegram: https://t.me/web3_block 测试环境 区块浏览器：https://scan.trustivon.com/ 测试币领取：https://faucet.trustivon.com/