开始时间:凌晨 00:08,本次讨论主要以泽辉和王欣为主,问题涉及到钱包登录的核心问题,特此记录

    泽辉:@王欣 可以直接发 钱包地址来登录吧?

    王欣:if (typeof window.ethereum !== ‘undefined’) {
    // Ethereum user detected. You can now use the provider.
    const provider = window[‘ethereum’];
    }

    metamask连接后,直接返回provider

    这个变量直接返回metamask当前选择的地址,也就是发起合约调用方的地址

    params: [
    {
    from: ‘0xb60e8dd61c5d32be8058bb8eb970870f07233155’,
    to: ‘0xd46e8dd67c5d32be8058bb8eb970870f07244567’,
    gas: ‘0x76c0’, // 30400
    gasPrice: ‘0x9184e72a000’, // 10000000000000
    value: ‘0x9184e72a’, // 2441406250
    data:
    ‘0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675’,
    },
    ];

    ethereum.sendAsync(
    {
    method: ‘eth_sendTransaction’,
    params: params,
    from: accounts[0], // Provide the user’s account to use.
    },
    (err, response) => {
    if (err) {
    // Handle the error
    } else {
    // This always returns a JSON RPC response object.
    // The result varies by method, per the JSON RPC API.
    // For example, this method will return a transaction hash on success.
    const result = response.result;
    }
    }
    );

    这块是调用metamask直接触发合约

    泽辉:这个是没用 web 3 吗?
    王欣:和metamask的交互不会涉及到公私钥,因为加密都是metamask内部处理的,前后端交互是不是要用到消息加解密?前端签名,后端验签

    泽辉:是的,我要发前面的数据给王帅,要做登录鉴权

    王欣:用的是 eth_sign吗?

    泽辉:是的
    2020-05-23 极客精神的体现:来自凌晨的探讨 - 图1
    这是个签名吗?

    王欣:一个是调用metamask签名,一个是调用web3签名,这两种机制不一样。web3的provider设置为metamask后,两个就是一回事了

    泽辉:this.web3.eth.sign我的这个把metamask的签名调起来了

    web3 = new Web3(web3js.currentProvider); web3js.currentProvider这个是metamask的吗?

    王欣:只要调用了metamask connect,这里的provider就是metamask了,否则是null

    泽辉:是的, 我是连接了metamask, 然后初始化web3的

    王欣:现在问题是,后端怎么验证签名?

    泽辉:@王帅 这个是 web3,也是 metamask 的签名,你那边能接出来吗?

    王帅:暂时不能
    2020-05-23 极客精神的体现:来自凌晨的探讨 - 图2

    王欣:
    let signature = web3.eth.sign(address, msg)

    let r = signature.slice(0, 66)
    let s = ‘0x’ + signature.slice(66, 130)
    let v = ‘0x’ + signature.slice(130, 132)

    后端要取到r,s,v

    泽辉:web3.eth.sign(dataToSign, address [, callback]) 是不是写反了?

    王欣:
    rpk, err := crypto.Ecrecover(signHash(data), sig)
    if err != nil {
    return common.Address{}, err
    }
    pubKey := crypto.ToECDSAPub(rpk)
    recoveredAddr := crypto.PubkeyToAddress(*pubKey)
    return recoveredAddr, nil

    后端go,调用ecrecover,从签名消息中可以得到签名方钱包地址

    是不是你们的问题?

    泽辉:是的,为什么访问yapi 会直接下载文件?
    http://yapi.comunion.io/

    web3 = new Web3(web3js.currentProvider);

    这里是不是也可以填写部署的合约地址

    王帅:ethUtil.fromRpcSig

    泽辉:
    web3.eth.sign(“Hello world”, “0x11f4d0A3c12e86B4b5F39B213F7E19D048276DAe”)
    .then(console.log);
    > “0x30755ed65396facf86c53e6217c52b4daebe72aa4941d89635409de4c9c7f9466d4e9aaec7977f05e923889b33c0d0dd27d7226b6e6f56ce737465c5cfd04be400”

    王帅:0x206c355c44b53b6eeaf5ae496cbe4521b2d0bb18

    泽辉:
    function _uint8ArrayToBuffer(chunk) {
    return Buffer.from(chunk);
    }

    此时已是凌晨 1:20


    本次讨论虽然只是解决其中一个问题,但是字里行间可以看得出大家对于工作的负责,哪怕看似简单的事情,也是会存在很多问题,这也体现出第一个版本的不易,并且大家讨论完问题已经是凌晨,第二天9点左右又开始工作、讨论,这种精神令我很是感动,也希望 Comunion 这种极客精神能够一直传承下去。