扣丁书屋

以太坊的离线Hash和离线签名(基于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。

最多阅读

去中心化交易所(DEX)协议整理 1年以前  |  1315次阅读
详解以太坊默克尔压缩前缀树-MPT 1年以前  |  1201次阅读
理解以太坊 Gas 燃料和交易手续费 1年以前  |  1057次阅读
以太坊基础配置 1年以前  |  1050次阅读
以太坊交易回执-Receipt 1年以前  |  994次阅读
墨客区块链(MOAC BlockChain) 助记词 1年以前  |  876次阅读
区块链小白书 1年以前  |  846次阅读
比特币白皮书中文版 1年以前  |  788次阅读
【译】完全理解以太坊智能合约 1年以前  |  787次阅读
以太坊账户模型 1年以前  |  768次阅读
Substrate 入门(5)- 区块头 1年以前  |  746次阅读
关于学分 1年以前  |  725次阅读
中国的区块链雄心:舍我其谁 1年以前  |  693次阅读
以太坊创世区块 1年以前  |  691次阅读
详解区块链P2P网络 1年以前  |  689次阅读

手机扫码阅读