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

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

以太坊solidity的数据格式和常见编程的数据格式不一样,举个例子来说,solidity的uint256,在c#中如果要转换,需要这样的代码:

    /// &lt;summary>
    /// 把uint转换成符合Solidity函数参数类型的byte数组
    /// &lt;/summary>
    /// &lt;param name="value">&lt;/param>
    /// &lt;returns>&lt;/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
  • 阅读 ( 1569 )
  • 学分 ( 17 )
  • 分类:DApp

评论