为什么要离线签名,主要就是安全,至于为什么安全这里不展开说。
以太坊solidity的数据格式和常见编程的数据格式不一样,举个例子来说,solidity的uint256,在c#中如果要转换,需要这样的代码:
/// <summary>
/// 把uint转换成符合Solidity函数参数类型的byte数组
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static byte[] GetSolidityUint256(uint value)
{
return new byte[32]
{
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,0,0,
0,0,0,
(byte)((value >> 24) & 0xFF),
(byte)((value >> 16) & 0xFF),
(byte)((value >> 8) & 0xFF),
(byte)value,
};
}
那么,在c#中的hash要把数值转换成solidity对应的数值类型才能和solidity中的hash一样。
C#的hash计算要采用Org.BouncyCastle.Crypto.Digests.KeccakDigest. 签名可以采用NBitcoin类库,Nethereum类库也封装了签名,直接使用Nethereum.Signer.MessageSigner类就可以。
Nethereum类库做了大量的工作,调用以太坊geth的API很容易和很方便。如果使用智能合约的代理类,其内部已经封装了离线签名的功能,使用起来很安全。但还是存在功能不完善的地方,例如没有封装whisper。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8