Task 1.1 — Transaction.sign()
标准解答
- 每个
Transaction有三个字段:时间戳、发送方、接收方。
- 需要实现
.sign()方法,为交易生成一个签名字符串。
- 签名必须:
- 定长,所有签名长度一样。
- 仅包含 [a–z0–9] 共 36 种字符。
- 签名空间大小至少达到 10^56(即 36^36 ≈ 10^56,长度 ≥ 36)。
核心思路
- 把
timestamp、from_user、to_user合并成一个输入字符串。
- 逐字符读取,做滚动计算:例如“当前位置 = (前一值 × 基数 + 当前字符编码)”。
- 不要限制在小模数上(如课堂例子里的 17),而是让数值无限增长,最后结果是一个超大整数。
- 把这个大整数转成 base‑36 表示,并确保最终字符串长度固定为 36(可以左侧补 0 或截取高位)。
伪代码
- 拼接三个字段成一个字符串 key。
- 初始化一个整数 acc = 0。
- 遍历 key 的每个字符:
- 取它的 ASCII 或自定义映射值。
- acc = acc * 基数 + 值 (基数可取 31、37 等素数)。
- 得到 acc 后,将其转为 base‑36 字符串。
- 如果不足 36 长度,就左边补 0;如果超过,截取固定 36 长度(保持一致)。
- 保存为
self.signature。
附加资料:
可以直接参考Workshop上讲的答案

Task 1.2 - Processing Line
标准解答
目标
- 实现一个
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_queue → after_stack