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

2673次阅读  |  发布于5年以前

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

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