开始时间:凌晨 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吗?
泽辉:是的
这是个签名吗?
王欣:一个是调用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 的签名,你那边能接出来吗?
王帅:暂时不能
王欣:
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 这种极客精神能够一直传承下去。
