Task 1 - Processing Line

Cs, Go!

||最后更新: 2025-9-15|

Task 1.1 — Transaction.sign()

1️⃣
标准解答
  • 每个 Transaction 有三个字段:时间戳、发送方、接收方。
  • 需要实现 .sign() 方法,为交易生成一个签名字符串。
  • 签名必须:
    • 定长,所有签名长度一样。
    • 仅包含 [a–z0–9] 共 36 种字符。
    • 签名空间大小至少达到 10^56(即 36^36 ≈ 10^56,长度 ≥ 36)。

核心思路

  • timestampfrom_userto_user 合并成一个输入字符串。
  • 逐字符读取,做滚动计算:例如“当前位置 = (前一值 × 基数 + 当前字符编码)”。
  • 不要限制在小模数上(如课堂例子里的 17),而是让数值无限增长,最后结果是一个超大整数。
  • 把这个大整数转成 base‑36 表示,并确保最终字符串长度固定为 36(可以左侧补 0 或截取高位)。

伪代码

  1. 拼接三个字段成一个字符串 key。
  1. 初始化一个整数 acc = 0。
  1. 遍历 key 的每个字符:
      • 取它的 ASCII 或自定义映射值。
      • acc = acc * 基数 + 值 (基数可取 31、37 等素数)。
  1. 得到 acc 后,将其转为 base‑36 字符串。
  1. 如果不足 36 长度,就左边补 0;如果超过,截取固定 36 长度(保持一致)。
  1. 保存为 self.signature

附加资料:

可以直接参考Workshop上讲的答案
notion image
 

Task 1.2 - Processing Line

1️⃣
标准解答

目标

  • 实现一个 ProcessingLine 类,管理一个“关键交易 (critical transaction)”以及其前后要处理的交易。
  • 提供 add_transaction() 添加新交易。
  • 允许 iter(line) 遍历交易,顺序正确。

数据结构

  • 一个队列 before_queue:保存时间戳 ≤ C 的交易。
  • 一个栈 after_stack:保存时间戳 > C 的交易。

迭代器逻辑 / 伪代码

  • __iter__
    • 如果已开始迭代,抛 RuntimeError
    • 否则锁定对象(不再允许新增交易),标记迭代已启动。
    • 返回自身作为迭代器。
  • __next__
    • 每次调用时:
      • before_queue 非空 → 弹出并签名后返回。
      • 否则若还没返回过 critical → 签名 critical 并返回。
      • 否则若 after_stack 非空 → 弹出并签名后返回。
      • 否则抛 StopIteration
上次跟新 2025年9月15日
2025年9月15日 - 修改了 after_queueafter_stack
 
Loading...