前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >algorithm 参与度算法

algorithm 参与度算法

作者头像
潇洒
发布2023-10-23 14:40:52
1230
发布2023-10-23 14:40:52
举报
文章被收录于专栏:石头岛石头岛

前言

参与度算法是用在计算多个节点之间的参与情况的算法,也就是说在多个已经确认的节点个数之间的一种算法。

说人话 就是假设有10个节点,这10个节点都正常工作参与度就是100%,如果挂了一个节点,参与度就是:90%。 是不是有点感觉了。

在分布式场景下,参与度是个重要的指标,尤其是各种分布式应用,那用的更是多。 比如有一堆reids集群,挂了几个还可以工作,这就是一个参与度的阀值。 在DPOS共识的区块链的场景下,这个值就可以起到一个参考指标的作用。

实现

代码语言:javascript
复制
package com.liukai.blockchain.labs;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;

import static java.util.Arrays.fill;

/**
 * @author liukai
 * @since 2022/4/25.
 */
public class BlockFilledSlot {

  public static Map<String, Object> database = new HashMap<>();

  public static final int BLOCK_FILLED_SLOTS_NUMBER = 128;

  static {
    initFill();
    initBlockFilledSlotsIndex();
  }

  public static void initFill() {
    int[] blockFilledSlots = new int[getBlockFilledSlotsNumber()];
    fill(blockFilledSlots, 1);
    database.put("BLOCK_FILLED_SLOTS", blockFilledSlots);
    System.out.println("init param");
    System.out.println("SlotCount=" + IntStream.of(blockFilledSlots).sum());
    System.out.println("Percent=" + calculateFilledSlotsCount() + "%");
    System.out.println("===================");
  }

  public static void initBlockFilledSlotsIndex() {
    database.put("BLOCK_FILLED_SLOTS_INDEX", 0);
  }

  public static int getBlockFilledSlotsIndex() {
    return (int) database.get("BLOCK_FILLED_SLOTS_INDEX");
  }

  public static int getBlockFilledSlotsNumber() {
    return BLOCK_FILLED_SLOTS_NUMBER;
  }

  public static int[] getBlockFilledSlots() {
    return (int[]) database.get("BLOCK_FILLED_SLOTS");
  }

  // 每一次 true false 都会让 index 往前移动一步
  public static void applyBlock(boolean fillBlock) {
    int[] blockFilledSlots = getBlockFilledSlots();
    int blockFilledSlotsIndex = getBlockFilledSlotsIndex();
//    System.out.println("blockFilledSlotsIndex before: " + blockFilledSlotsIndex);
    blockFilledSlots[blockFilledSlotsIndex] = fillBlock ? 1 : 0;
    saveBlockFilledSlots(blockFilledSlots);
    saveBlockFilledSlotsIndex((blockFilledSlotsIndex + 1) % getBlockFilledSlotsNumber());
//    System.out.println("blockFilledSlotsIndex after: " + getBlockFilledSlotsIndex());
  }

  private static void saveBlockFilledSlots(int[] blockFilledSlots) {
//    System.out.println("array: " + Arrays.toString(blockFilledSlots));
    database.put("BLOCK_FILLED_SLOTS", blockFilledSlots);
  }

  private static void saveBlockFilledSlotsIndex(int i) {
    database.put("BLOCK_FILLED_SLOTS_INDEX", i);
  }

  public static int calculateFilledSlotsCount() {
    int[] blockFilledSlots = getBlockFilledSlots();
    int sum = IntStream.of(blockFilledSlots).sum();
//    System.out.println("calculateFilledSlotsCount: " + sum);
    return 100 * sum / getBlockFilledSlotsNumber();
  }

  public static void main(String[] args) {
    int slot = 64;
    // 实际中,slot 的个数是根据 witness 的产块与否来决定的
    for (int i = 0; i < slot; i++) {
      applyBlock(false);
      System.out.println("SlotsCount: " + IntStream.of(getBlockFilledSlots()).sum());
      System.out.println("Percent: " + calculateFilledSlotsCount() + " %");
    }
    System.out.println("-----------");
    for (int i = 0; i < 128; i++) {
      applyBlock(true);
      System.out.println("SlotsCount: " + IntStream.of(getBlockFilledSlots()).sum());
      System.out.println("Percent: " + calculateFilledSlotsCount() + " %");
    }
  }
}

总结

这个算法,其实就是对一个百分比波动的简单算法的实现。不管是否简单,在实际应用中,确可以发挥作用,也值得学习。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实现
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档