R-Puzzle

在 R-puzzle 中,永远不会公开临时私钥 k。而是公开 r 和来自 r 的签名,rk 对应的公钥的 x 坐标,并使用现有的 checkSig 来证明知道 k。更多信息可以在 R-Puzzle 章节中找到。

contract RPuzzle {
    Ripemd160 rhash;

    // extract r from DER-encoded signature
    static function extractRFromSig(Sig sig) : bytes {
        int rlen = unpack(sig[3 : 4]);
        return sig[4 : 4 + rlen];
    }

    public function unlock(Sig sig, PubKey pubKey, Sig sigr) {
        require(this.rhash == hash160(extractRFromSig(sigr)));
        require(checkSig(sigr, pubKey));
        require(checkSig(sig, pubKey));
    }
}