以太坊的离线Hash和离线签名(基于C#)

C#的离线签名

为什么要离线签名,主要就是安全,至于为什么安全这里不展开说。

以太坊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。

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2020-01-01 22:47
  • 阅读 ( 787 )
  • 学分 ( 17 )
  • 分类:DApp

0 条评论

请先 登录 后评论
Phi·Wallet
Phi·Wallet

区块链爱好者和从业者

1 篇文章, 31 学分