主页 > 安卓怎么下载imtoken钱包 > 以太坊常用术语解释及连接

以太坊常用术语解释及连接

安卓怎么下载imtoken钱包 2023-07-08 05:10:13

以太坊Keccak256中常用术语的解释和联系

比特币和以太坊都使用SHA(Security Hash Algorithm)哈希函数进行加密,比特币使用SHA256(属于SHA2),以太坊使用SHA3(Keccak256函数)。

Keccak256在以太坊中用在很多地方:地址生成、签名、交易。

帐户

在以太坊中,有两种类型的账户:

1. 外部账户(EOAs,Externally Owned Accounts)

2. 合约账户

当我们提到账户这个词时,我们通常指的是外部账户(EOA),而当我们提到合约账户时,我们通常将其称为“智能合约”。

气体

每笔交易都需要包含 gas limit(有时称为 startGas)和 gas price(交易愿意支付单位 gas)。

Gas由这两部分组成:Gas limit(限制)* Gas​​ Price(价格)

如果我在交易中将 gas 价格设置得太低,没有人会接受我的交易作为优先运行。 矿工基本上不愿意把你的交易打包进一个区块。 如果我提供一个大家都能接受的gas价格,但是我的交易产生了太多的计算工作,gas的成本超过了我的额外成本,这个gas已经“花掉”了,没有办法回收了。 矿工将停止处理该交易,恢复该交易所做的任何更改,但仍将其作为“失败交易”包含在区块中,并收取您支付的费用。 这可能看起来很苛刻,但是当您意识到矿工的真正工作是执行计算时,您会发现他们永远无法获得这些资源。 因此,只有当你付钱并且他们做他们应该做的事情时才公平,尽管你的糟糕设计没有支付足够的汽油。 提供过高的费用也不同于提供过多的以太币。 如果你设置了很高的gas price,你只需要为一些简单的操作支付大量的以太币,就像在比特币中设置超高的交易费一样。 你的任务肯定会排在最优先队列的前面,但是你的钱已经付过了。 但是,如果你提供正常的 gas 价格,并且只要你附加的以太币多于你的交易消耗的 gas,那么以太网络就会退还你多出的费用。 矿工只向你收取实际工作费用。 你可以把 gas price 看作是矿工的小时工资,gas cost 就是工作时间。

地址和公私钥

地址是我们与以太坊系统交互的标识。 它是与外界交互的以太坊账户的名称。 对于外部账户,地址代表账户公钥的最后 20 个字节(通常以 0x 开头)。

一般来说,地址生成的过程是:私钥->公钥->地址。 因此,地址生成需要三个步骤:

1.生成随机私钥(32字节)

2.从私钥生成公钥(64字节)

3.通过公钥获取地址(20字节)

符号

数字签名是一种用于证明数字消息或文档真实性的数学方案。 有效的数字签名使收件人有理由相信消息是由已知发件人创建的(身份验证),发件人不能拒绝消息的传递(不可否认性),并且消息在传输过程中未被更改(完整性)。

数字签名是一个由两部分组成的数学方案。 第一部分是使用消息(交易)中的私钥(签名密钥)创建签名的算法。 第二种算法允许任何人仅使用消息和公钥来验证签名。

目前主流的两种非对称加密算法是RSA和ECDSA(Elliptic Curve Digital Signature Algorithm),以太坊采用ECDSA加密算法进行数字签名。 sendRawTransaction函数的每个入参都会被from对应的key签名,得到三个量:v,r,s。 同时,每个输入参数仍然以原来可见的形式进入序列化步骤。

1.数据签名:

在以太坊的 ECDSA 实现中,签名的“消息”是交易,签名密钥是 EOA 的私钥。 使用签名函数计算序列化消息的Keccak256哈希和私钥,得到签名Sig=(v,r,s)

2.签名验证:

对应以太坊的sendRawTransaction RPC接口,收到RLP序列化数据后,先对RLP进行反序列化,利用消息和签名推导出对方的公钥。 然后使用消息的公钥、签名和哈希值计算出一个名为 r 的值。 这个 r 是签名的一部分。 要验证签名,请将计算出的 r 与签名中携带的 r 进行比较。 如果它们一致,则验证通过了测试。

贸易

首先是关于交易的两段定义:

1. 外部账户生成一段加密签名的指令序列化后交给区块链,分为消息通信和合约创建。

2. 由外部拥有的账户发起的签名消息,由以太坊网络传输,并记录(挖掘)在以太坊区块链上。

一般来说,以太坊中的交易分为三种:转账交易、合约创建和合约调用。

转账交易:

{
    nonce: '0x28',
    gasPrice: '0x3b9aca00',
    gasLimit: '0x12cab',
    to: '0x71c541231f5bb1ccf924ab1ae2259a82318c9df4',
    value: '0xde0b6b3a7640000',
    data: ''
}
复制代码

此类交易的to字段为收款人地址,value字段为转账的以太币数量,data字段为空。

合约创建:

{
    nonce: '0x18',
    gasPrice: '0x3b9aca00',
    gasLimit: '0xa23d8',
    to: '',
    value: '0x00',
    data: '0x6060604052341561000f57600080fd5b6108f98061001e6000396000f300606060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063762db2b4146100675780639d4ff8ad14610120578063b2c21c9114610191578063bcea56e014610221575b600080fd5b341561007257600080fd5b61009e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102da565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156100e45780820151818401526020810190506100c9565b50505050905090810190601f1680156101115780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561012b57600080fd5b61017b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610486565b6040518082815260200191505060405180910390f35b341561019c57600080fd5b61020b600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610499565b6040518082815260200191505060405180910390f35b341561022c57600080fd5b610258600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610654565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561029e578082015181840152602081019050610283565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b60006102e4610800565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104765780601f1061044b57610100808354040283529160200191610476565b820191906000526020600020905b81548152906001019060200180831161045957829003601f168201915b5050505050905091509150915091565b60006104928233610499565b9050919050565b60006104a3610814565b839050600081511180156104b8575060648151105b15156104c357600080fd5b4291506040805190810160405280838152602001858152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101908051906020019061057c929190610828565b509050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f3a2267d580cf7cd5f1c6b0aaefb67f309eb1469554ef9b8355bbf413dcc97317866040518080602001828103825283818151815260200191508051906020019080838360005b838110156106105780820151818401526020810190506105f5565b50505050905090810190601f16801561063d5780820380516001836020036101000a031916815260200191505b509250505060405180910390a38191505092915050565b600061065e610800565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101808054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f05780601f106107c5576101008083540402835291602001916107f0565b820191906000526020600020905b8154815290600101906020018083116107d357829003601f168201915b5050505050905091509150915091565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061086957805160ff1916838001178555610897565b82800160010185558215610897579182015b8281111561089657825182559160200191906001019061087b565b5b5090506108a491906108a8565b5090565b6108ca91905b808211156108c65760008160009055506001016108ae565b5090565b905600a165627a7a72305820125d82944ab5d02eb4d5d6182e6eb60dd47a0e64494bec20f9300b3fdb33f6a20029'
}
复制代码

创建合约的交易为空,值为0,数据为合约编译后的BineryCode。

合约调用:

0x48be4583a90f253bcc92cec60b244d7de57aa1f425e181545ac036d0d20c47a1
{
    nonce: '0x19',
    gasPrice: '0x3b9aca00',
    gasLimit: '0x18c67',
    to: '0xc59565465f95cd80e7317dd5a03929e6900090ff',
    value: '0x00',
    data: '0xb2c21c9100000000000000000000000000000000000000000000000000000000000000400000000000000000000000005902598fc6c9c85bec8452f9ba3fca2f8b226a1b000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000'
}
复制代码

调用合约的交易是合约地址,值为0,数据结构稍微复杂一点。 对它的探索也是写这篇博客的主要目的。 后面我们也会了解交易数据在区块链1.0网络中是如何使用的。 形式传输和记录。

发送到合约的数据负载是十六进制序列化编码的:

> 函数选择器:函数原型的 Keccak256 散列的前 4 个字节。 这允许 EVM 明确识别您要调用的函数。

函数参数:按照EVM定义的各种原始类型的规则进行编码。

简单的说就是将要调用的函数名的签名和函数调用参数的编码拼接起来形成data数据。

根据以太坊合约ABI的规则,首先获取函数的签名。 计算方法是使用函数签名的keccak256的hash,占4个字节,转成hex就是前8个字符。

接下来以太坊交易系统,对参数进行编码。 首先,根据参数类型,如果一个动态类型参数(如string)的位数不确定,则应放在相对于所有参数的末尾。 偏移量为:2 * 32字节(两个参数以太坊交易系统,每个参数32字节),转成16进制补足32字节; 如果参数类型具有固定数量的数字,则直接编码并完成32个字节。内容进入代码(如'Hello'字串经过十六进制代码为:48656c6c6f000000000000000000000000000000000000000000000000000000)。

一旦你有了交易数据,你就可以使用之前生成的私钥来签署交易。 涉及到交易数据格式的转换(RLP序列化),也可以直接使用ethereumjs-tx完成交易签名(…):

import EthereumTx from 'ethereumjs-tx';
/**
 * 交易签名并序列化
 * @param {Buffer} privateKeyBuffer 私钥
 * @param {Object} txParams 交易结构体
 */
function signTx(privateKeyBuffer, txParams) {
      const tx = new EthereumTx(txParams);
      tx.sign(privateKey);
      const serializedTx = tx.serialize();
      return serializedTx;
}
let txParams = {
    nonce: '0x19',
    gasPrice: '0x3b9aca00',
    gasLimit: '0x18c63',
    to: '0xc59565465f95cd80e7317dd5a03929e6900090ff',
    value: '0x00',
    data: '0xb2c21c9100000000000000000000000000000000000000000000000000000000000000400000000000000000000000005902598fc6c9c85bec8452f9ba3fca2f8b226a1b000000000000000000000000000000000000000000000000000000000000000548656c6c6f000000000000000000000000000000000000000000000000000000',
    chainId: 3
}
let serializedTx = signTx(privateKey, txParams).hexSlice();
console.log("交易" + ":" + serializedTx);
交易数据:f8e919843b9aca0083018c6394c59565465f95cd80e7317dd5a03929e6900090ff80b884b2c21c9100000000000000000000000000000000000000000000000000000000000000400000000000000000000000005902598fc6c9c85bec8452f9ba3fca2f8b226a1b000000000000000000000000000000000000000000000000000000000000000548656c6c6f0000000000000000000000000000000000000000000000000000002aa082accda7fe28468bda030cd5ae8dad359b7963a9d2ab63c897d1f17196171ff5a053544c8a49e921e7f35c1c35d9340215566f0b9dd1e0504f768b8c993bc96bcf
复制代码

这是以太坊中的三种交易类型。

概括

这期间看的很多论文都使用了以太坊技术,但是由于对其步骤和原理没有深入了解,很多应用框架都无法很好的理解。 我特地用了一天时间查看相关的博客和文章。 我不熟悉它总结的地方。 希望我每天都能进步^^