普通视图

发现新文章,点击刷新页面。
昨天以前首页

如何构建一个具有重试机制的 Steem 区块链见证人投票检查器


当使用像 Steem 这样的去中心化平台时,重要的是要预期偶尔的故障——网络问题、API 限制或暂时的停机。这就是为什么你构建的任何集成、机器人或工具都应该能够优雅地失败并智能地恢复。

在这篇文章中,我将带你了解一个简单而强大的 Steem 区块链见证人(也就是STEEM上的矿工)投票检查工具:

第一版:检查是否由某个见证人投票

这是一个实用的 Node.js 函数,用于检查一个 Steem 用户是否投票支持了某个特定的 见证人——无论是直接投票还是通过代理。

function is_voted_by(witness, id) {
    return new Promise((resolve, reject) => {
        steem.api.getAccounts([id], function(err, response) {
            if (err) reject(err);
            if (typeof response == "undefined") reject("undefined");
            const data = response[0];
            resolve((data.proxy === witness) || data.witness_votes.includes(witness)); 
        });          
    });
}

它获取给定 id 的账户数据,然后检查该用户是否设置了匹配目标见证人的投票代理,或者该见证人是否在他们的直接投票列表中。

启用重试的 Steem 见证人投票检查器

这是更新版的函数,包含简单的重试机制(最多重试 3 次,每次重试间隔 1 秒)。以下的代码加入了重试功能:

function is_voted_by(witness, id, retries = 3) {
    return new Promise((resolve, reject) => {
        const attempt = (remaining) => {
            steem.api.getAccounts([id], function(err, response) {
                if (err || typeof response === "undefined") {
                    if (remaining > 0) {
                        setTimeout(() => attempt(remaining - 1), 1000); // 重试 1 秒后
                    } else {
                        reject(err || "undefined response");
                    }
                    return;
                }
                const data = response[0];
                resolve((data.proxy === witness) || data.witness_votes.includes(witness)); 
            });
        };
        attempt(retries);
    });
}

此版本在 Steem API 调用失败或返回 undefined 时最多进行 3 次重试,帮助处理不稳定的网络状况或临时的 API 问题。功能保持不变:检查直接的见证人投票或代理委托/Proxy。

重试的指数退避机制

使用指数退避机制/Exponential backoff来避免过度请求 API,并记录每次尝试以便于调试和更好的可视化。

module.exports.is_voted_by = function(witness, id, retries = 3, delay = 1000) {
    return new Promise((resolve, reject) => {
        const attempt = (remaining, currentDelay) => {
            console.log(`Checking vote for "${id}" against witness "${witness}"... (${retries - remaining + 1}/${retries})`);

            steem.api.getAccounts([id], function(err, response) {
                if (err || typeof response === "undefined") {
                    console.warn(`Attempt failed: ${err || 'undefined response'}`);
                    
                    if (remaining > 0) {
                        console.log(`Retrying in ${currentDelay}ms...`);
                        setTimeout(() => attempt(remaining - 1, currentDelay * 2), currentDelay); // 指数退避
                    } else {
                        reject(err || "undefined response after retries");
                    }
                    return;
                }

                const data = response[0];
                const voted = (data.proxy === witness) || data.witness_votes.includes(witness);
                console.log(`Vote check result: ${voted}`);
                resolve(voted);
            });
        };

        attempt(retries, delay);
    });
};

该函数:

  • 调用 Steem API 获取给定 id 的账户信息。
  • 检查用户是否投票支持某个特定的见证人,检查方式包括:直接投票(即 witness_votes 中包含该见证人),或通过代理投票(即 proxy === witness)。

如果 API 调用失败或返回 undefined,它将:

  • 等待一段时间,
  • 重试(最多重试 retries 次),
  • 并且每次的等待时间按指数方式增加(1秒、2秒、4秒等)。
为什么要使用指数退避?

指数退避是网络编程中的经典策略——如果服务暂时不可用,快速连续请求只会让问题更加严重。通过在重试之间增加延迟,可以让系统有时间恢复,并且对 API 更加友好。

is_voted_by('witness-name', 'username')
    .then(voted => {
        if (voted) {
            console.log("User supports the witness!");
        } else {
            console.log("User has not voted for the witness.");
        }
    })
    .catch(err => {
        console.error("Error checking vote:", err);
    });

最后的思考

在构建与区块链交互的工具时,弹性至关重要。适当的重试逻辑能大大提高你的应用程序的稳定性和用户友好性——即使在底层基础设施出现问题时也能保持正常运行。

Steem/Steemit区块链

英文:

本文一共 672 个汉字, 你数一下对不对.
如何构建一个具有重试机制的 Steem 区块链见证人投票检查器. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 如何构建一个具有重试机制的 Steem 区块链见证人投票检查器 Javascript STEEM 区块链 区块链 程序设计
The post 如何构建一个具有重试机制的 Steem 区块链见证人投票检查器 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
  2. 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...
  3. 剑桥网红餐厅 The Ivy Cambridge Brasserie 上周刚过40岁生日,媳妇带我去剑桥的一家网红餐厅——The Ivy Cambridge Brasserie。这家餐厅是朋友推荐的,和那家Trinity一样很有名,可惜我们在剑桥待了近10年才知道。 The Ivy Cambridge Brasserie 是剑桥市中心一家备受欢迎的网红餐厅,位于历史悠久的 Trinity Street。餐厅设计时尚典雅,融合了现代与经典元素,为食客提供了一个舒适而奢华的用餐环境。这里的菜单丰富多样,覆盖全天用餐,从早餐到晚餐以及下午茶,提供英式经典美食如松露鸡肉派、英式早餐等,也有一些国际风味的菜肴。得天独厚的位置和独特的氛围使得 The Ivy Cambridge Brasserie...
  4. 负电价活久见: 安装Octopus智能电表省电费甚至赚钱 前几周我的电气公司 Octopus 终于来装智能电表了(Smart Meter),虽然是免费安装的,但是排队排了有两三年了吧。因为之前一直写邮件催的时候就老是说 Not Ready。 收到邮件说可以安装智能电表我还是相当开心和期待的,因为已经听说这玩意好,但是还是得亲身体验一下。工程师来安装大概不到2小时,其中需要停电闸一会儿,重新接下线。装好后,给了个小册子,自动切换到了 Agile 的电价,也就是每半小时的电价都不一样,提前一天可以在手机App和网站上查得。 正好在原来的电价计费合同快要结束前2天换到了智能电表计价 Octopus Agile方式,但是系统还是扣了我75英镑 Exit Fee (提前合同结束得交违约费),不过我一个电话打过去,公司很爽快就给我退了。...
  5. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
  6. 测测你的幸运 – Linux Fortune-Teller LINUX 下有很好很好玩的命令,之前已经介绍过: figlet, rig, curl. 现在推荐另一个 命令 fortune 是用来随机显示一段(句)话的.fortune 在英文里就是幸运的意思. 这个命令可以不需要 参数 如果没有 可以通过 apt-get...
  7. Discord 和公众号都启用 强大的 P命令 O 哥的公众号里有一个 ?pu 命令很方便, 可以根据当前的行情, 市场价 feed price 等信息自动给出是否应该是 100% 发文或者 50/50. 今天有点时间, 整合到 Discord...
  8. 撸了一个Steem粉丝点赞检查工具 – 快速检查你的粉丝到底有没有给你点赞 (带免费API) 花了三小时, 总算把这个小工具(自带API)的做出来的, 主要的用法就是给定一个STEEM贴, 然后分析出ID号, 然后得出粉丝列表, 然后再解析HTML源代码分析出当前点赞的粉丝, 最后面计算两个数组的差别就是没有点赞的粉丝. 工具试一下好不好用. 有问题联系 @justyy 点我: Steem粉丝点赞检查工具 输入STEEM的文章地址按回车或者点击 按钮 等待一会,...
❌
❌