Idea 分享:JoyID 如何扩大自己的优势?以及 Nervos 是否应该跟随 Bitcoin 的步伐?

我觉得,JoyID最大的优势是设备即钱包(Device as a wallet)。那么,如何扩大这方面的影响力呢?

从目前的文档了解到,JoyID正在拓展到以太坊生态。
个人觉得,在以太坊之外,还可以跟随某些名人的脚步,比如Jack Dorsey。—— 当然,这里并不是说需要JoyID官方去做,不过,可以开放相关的接口,提供一个生态爆发的机会。

那么,从Nostr方向看,如何做呢?

  1. 可以参考 Bitcoin 的 Zap ,实现 Nervos 相关的 NIP 。
  2. 参考 Wallet NIP,实现基于 JoyID 生成 nostr 的公钥及相关接口的功能。
    想一想,通过 JoyID 登录 nostr 怎么样?
  3. 说是跟着 Jack 的步伐加入 nostr 生态,倒不如说是跟随 Bitcoin 的步伐,把 Nervos 扩展到支持 Bitcoin 的那些产品中。——为何这么说呢?最关键的一点是,BTC已经从白皮书中的支付(电子现金)目标,从事实上变成了数字黄金。而支付、打赏一般需要小价值的货币,这也是 Doge、电子网络 为何流行的原因之一。同样是 UTXO + PoW,CKB 能否继承 BTC 白皮书上最初的那个支付目标呢?我觉得,这也是为何说跟随 BTC 去集成各种生态产品的原因。

好吧,最重要要的是,JoyID 要尽快推出相关的接口啊 @Cipher O(∩_∩)O

7 Likes

nostr 对于 NIP 的提交有一定要求:至少两个客户端和一个relay集成

但是,初期对于CKB而言,只需要客户端处理就好了。简单说,把nostr的私钥转换成一个CKB地址显示出来。已将专门给nostr进行签名的浏览器扩展:nos2x 进行fork:

读取私钥很简单:

// extension/popup.jsx
function Popup() {
  let [pubKey, setPubKey] = useState('')
  let keys = useRef([])

  let [ckbAddress, setCkbAddress] = useState('')

  useEffect(() => {
    browser.storage.local.get(['private_key', 'relays']).then(results => {
      if (results.private_key) {
        // results.private_key is a hex with length 64, no '0x' prefix
        const ckb_addr = getCkbAddress(`0x${results.private_key}`);
        setCkbAddress(ckb_addr);

        let hexKey = getPublicKey(results.private_key)
        let npubKey = nip19.npubEncode(hexKey)

        setPubKey(npubKey)

results.private_key中读取到的就是64字节的hex。
对于nos2x这个fork而言,后面就是引入ckb.js展示出ckb地址(以及余额);
进一步是通过这个私钥进行打赏操作(转账)。

  1. nos2x 需要新增的库:buffer, elliptic, @ckb-lumos/config-manager, @ckb-lumos/helpers
  2. extension 目录中添加nervos.js文件:
    ···
    import { Buffer } from ‘buffer’;
    import { ec as EC } from “elliptic”;
    import { HexString, utils } from “@ckb-lumos/base”;
    import { initializeConfig, predefined } from ‘@ckb-lumos/config-manager’;
    import { encodeToAddress } from ‘@ckb-lumos/helpers’;

global.Buffer = Buffer;
const ec = new EC(“secp256k1”);

function assertPrivateKey(privateKey) {
utils.assertHexString(“privateKey”, privateKey);
if (privateKey.length !== 66) {
throw new Error(privateKey must be length of 32 bytes!);
}
}

function assertPublicKey(publicKey, debugPath) {
debugPath = debugPath || “publicKey”;
utils.assertHexString(debugPath, publicKey);
if (publicKey.length !== 68) {
throw new Error(publicKey must be length of 33 bytes!);
}
}

export function privateToPublic(privateKey) {
let pkBuffer = privateKey;
if (typeof privateKey === “string”) {
assertPrivateKey(privateKey);
pkBuffer = Buffer.from(privateKey.slice(2), “hex”);
}
if (pkBuffer.length !== 32) {
throw new Error(“Private key must be 32 bytes!”);
}
const publickey = ec.keyFromPrivate(pkBuffer).getPublic(true, “hex”);
if (typeof privateKey === “string”) {
return “0x” + publickey;
}
return Buffer.from(publickey, “hex”);
}

export function publicKeyToBlake160(publicKey) {
assertPublicKey(publicKey);
const blake160 = new utils.CKBHasher()
.update(publicKey)
.digestHex()
.slice(0, 42);
return blake160;
}

export function privateKeyToBlake160(privateKey) {
const publicKey = privateToPublic(privateKey);
return publicKeyToBlake160(publicKey);
}

export function getCkbAddress(privateKey) {
const config = predefined.LINA;
initializeConfig(config);

const pk = privateToPublic(privateKey);
const blake160 = publicKeyToBlake160(pk);
//encodeToConfigAddress(blake160, )

const script = {
    codeHash: config.SCRIPTS.SECP256K1_BLAKE160.CODE_HASH,
    hashType: "data1",
    args: blake160,
};

const addr = encodeToAddress(script, config);
return addr;

}
···

  1. 修改build.js
    entryPoints: {
      'nervos.build': './extension/nervos.js',
      'popup.build': './extension/popup.jsx',
      //...
    },

效果:

1 Like