关于以太坊的nonce值

2023-10-26


nonce在区块链中是一个非常重要的概念,从比特币到以太坊都有nonce的身影。

在比特币中,nonce主要用于调整pow挖矿的难度,而在以太坊中,除了调整挖矿难度外,在外部账户的每笔交易中也都存在一个nonce。这个nonce是一个连续的整数,在每个账户发送交易时所产生,其主要设计目的是为防止双花。

web3中的sendTransaction方法,官方文档是这样写的:

https://web3js.readthedocs.io/en/1.0/web3-eth.html#sendtransaction

sendTransaction
web3.eth.sendTransaction(transactionObject [, callback])
Sends a transaction to the network.

Parameters
Object - The transaction object to send:
from - String|Number: The address for the sending account. Uses the web3.eth.defaultAccount property, if not specified. Or an address or index of a local wallet in web3.eth.accounts.wallet.

to - String: (optional) The destination address of the message, left undefined for a contract-creation transaction.
value - Number|String|BN|BigNumber: (optional) The value transferred for the transaction in wei, also the endowment if it’s a contract-creation transaction.

gas - Number: (optional, default: To-Be-Determined) The amount of gas to use for the transaction (unused gas is refunded).

gasPrice - Number|String|BN|BigNumber: (optional) The price of gas for this transaction in wei, defaults to web3.eth.gasPrice.

data - String: (optional) Either a ABI byte string containing the data of the function call on a contract, or in the case of a contract-creation transaction the initialisation code.

nonce - Number: (optional) Integer of a nonce. This allows to overwrite your own pending transactions that use the same nonce.

每笔交易nonce值的各个情况

可以看到,在构建交易时,有一个可选的nonce参数,可以覆盖在交易池中的,pending列表中相同nonce的交易。

接下来我会在Geth搭建的私有链来进行以下实验,来看看不同情况下nonce对应的交易会怎样:

  • 相同nonce下的两笔交易
  • 不连续nonce下的交易
  • 不具体指定nonce的交易

首先下方命令看到地址0xfa8d4ded7fe1fec96c1b10443bea261195f233bb的总交易数是2,也就是说,nonce数值已累加到2(nonce值从0开始),新的交易nonce值将是3。

> eth.getTransactionCount("0xac965f9832efd7684bbbd7ceed5891a337bca302")
3

接下来指定nonce为3,创建一笔交易,如下可看到,交易成功,并被打包到了3485668区块中。

> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000", nonce: "3"})
"0x497c21a80d821634116d96ca8f40a70bcb7013b4d11019d75b522fa1b46a82d7"

> eth.getTransaction("0x497c21a80d821634116d96ca8f40a70bcb7013b4d11019d75b522fa1b46a82d7")
{
  blockHash: "0xc1aad9012d8bfc34a5003d73f7507bfe562cba306223d81f0050476ca698a455",
  blockNumber: 3485668,
  from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
  gas: 21000,
  gasPrice: 1000000000,
  hash: "0x497c21a80d821634116d96ca8f40a70bcb7013b4d11019d75b522fa1b46a82d7",
  input: "0x",
  nonce: 3,
  r: "0xddde68ee95d14273b1b45ce6df5a40bd079357cb7eb1281d7edebb88799ed554",
  s: "0x7584f6cd4e8cad3c3691ca3ec1d671c9096f7aca61386665baaec481e937f8cc",
  to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
  transactionIndex: 0,
  type: "0x0",
  v: "0x539bb",
  value: 3000000000000000000
}

如果此时我在发送一笔交易,并指定nonce还是3,运行结果如下所示。

会看到此时交易报错,提示“nonce too low”

> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000", nonce: "3"})
Error: nonce too low
	at web3.js:6347:37(47)
	at web3.js:5081:62(37)
	at <eval>:1:25(13)

按照nonce的规则,接下来的新交易nonce值应该是4,我现在跳过4,直接指定nonce值为5,会发生什么,如下所示。

>  web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000", nonce: "5"})
"0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9"

可以看到,返回了交易hash,我们查看该笔交易,发现blockNumber为null,并没有加入到区块中,如下所示:

> eth.getTransaction("0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9")
{
  blockHash: null,
  blockNumber: null,
  from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
  gas: 21000,
  gasPrice: 1000000000,
  hash: "0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9",
  input: "0x",
  nonce: 5,
  r: "0x6499ec326d5d9f1e5035fc4e7612b1e52c0c1bc60baf6f4068eaf790afe03f70",
  s: "0x2e66b705148769b3e394dc8f9e6be9ad597c7144aaafdb5894e5ac8ce46a39bb",
  to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
  transactionIndex: null,
  type: "0x0",
  v: "0x539bb",
  value: 3000000000000000000
}

暂未被加入到区块中的交易,会被放入到交易池中(txpool),交易池里会维护两个列表,一个是待被打包的pending列表,一个是当前无法执行的交易queued列表。

从下方请求可看到0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9交易被放到了queued列表中。这是由于交易池中没有找到地址0xac965f9832efd7684bbbd7ceed5891a337bca302为4的nonce。

当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。

> web3.txpool.content.queued
{
  0xaC965f9832eFD7684BBBd7cEED5891a337bCA302: {
    5: {
      blockHash: null,
      blockNumber: null,
      from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
      gas: "0x5208",
      gasPrice: "0x3b9aca00",
      hash: "0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9",
      input: "0x",
      nonce: "0x5",
      r: "0x6499ec326d5d9f1e5035fc4e7612b1e52c0c1bc60baf6f4068eaf790afe03f70",
      s: "0x2e66b705148769b3e394dc8f9e6be9ad597c7144aaafdb5894e5ac8ce46a39bb",
      to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
      transactionIndex: null,
      type: "0x0",
      v: "0x539bb",
      value: "0x29a2241af62c0000"
    }
  }
}

新建一笔交易,设置nonce为4,如下所示。

会看到提交交易后,queued列表中nonce为5的交易也被移出,同时待打包的pending列表中,有了nonce值为4和5的交易信息。挖矿后,这两笔交易将会被写入到区块中。

> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "6000000000000000000", nonce: "4"})
"0xd8610ad5962e88f2eaeb8fd7f18da1df978389a73b6e180cd34751dc32c1c975"


> web3.txpool.content.pending
{
  0xaC965f9832eFD7684BBBd7cEED5891a337bCA302: {
    4: {
      blockHash: null,
      blockNumber: null,
      from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
      gas: "0x5208",
      gasPrice: "0x3b9aca00",
      hash: "0xd8610ad5962e88f2eaeb8fd7f18da1df978389a73b6e180cd34751dc32c1c975",
      input: "0x",
      nonce: "0x4",
      r: "0xef4b52cd0a8ff5d4d119b43f2ebfbca3ed0785a19df2a90e9b9c4a9a39b07ddf",
      s: "0x191d51cca73168957d9184cd2cf09f2fd713298139e7438d71bb6c19ea606603",
      to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
      transactionIndex: null,
      type: "0x0",
      v: "0x539bb",
      value: "0x53444835ec580000"
    },
    5: {
      blockHash: null,
      blockNumber: null,
      from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
      gas: "0x5208",
      gasPrice: "0x3b9aca00",
      hash: "0x8e8967d1c6122006d199f375f96e9100c8810b2c97848a1006b2eba14c54a8d9",
      input: "0x",
      nonce: "0x5",
      r: "0x6499ec326d5d9f1e5035fc4e7612b1e52c0c1bc60baf6f4068eaf790afe03f70",
      s: "0x2e66b705148769b3e394dc8f9e6be9ad597c7144aaafdb5894e5ac8ce46a39bb",
      to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
      transactionIndex: null,
      type: "0x0",
      v: "0x539bb",
      value: "0x29a2241af62c0000"
    }
  }
}

那么如果当我们发起一笔交易,假设当前nonce为11,交易已经发送至节点中,但由于手续费不高或网络拥堵或nonce值过高,此交易处于queued中迟迟未被打包。

同时此地址再发起一笔交易,并且nonce值与上一个nonce值相同,用同样的nonce值再发出交易时,就会有两种情况:

如果手续费低于原来的交易就会发生异常:replacement transaction underpriced。

// 发生一笔nonce为11,gasPrice为78 gwei的交易
web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000",gas:"21000",gasPrice:"78000000000",nonce: "11"})
"0x3aaf3f302464e591cca759ee72d46461c145d4496bde488bcf59c7c5643dd05d"

// 当以上交易还没有上链时,再次发生一笔nonce为11,gasPrice为75 gwei的交易,则会报错
> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000",gas:"21000",gasPrice:"75000000000",nonce: "11"})
Error: replacement transaction underpriced
	at web3.js:6347:37(47)
	at web3.js:5081:62(37)
	at <eval>:1:25(17)

如果手续费高于原来的交易,那么第一笔交易将会被覆盖。

// 发生一笔nonce为13,gasPrice为78 gwei的交易
> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000",gas:"21000",gasPrice:"78000000000",nonce: "13"})
"0x757cccf40ab253a69c3b314993ad6fad71c097d8b0e69ead2dacdb6b75e03c23"

// 当以上交易还没有上链时,再次发生一笔nonce为13,gasPrice为88 gwei的交易,发现交易成功了
> web3.eth.sendTransaction({from: "0xac965f9832efd7684bbbd7ceed5891a337bca302", to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2", value: "3000000000000000000",gas:"21000",gasPrice:"88000000000",nonce: "13"})
"0xab538aaded6f1232b2198b3b508b910367c73af20cfd2d0ad0117faa6b8aadaf"

// 最后查询第一笔交易,发现查询为空
> eth.getTransaction("0x757cccf40ab253a69c3b314993ad6fad71c097d8b0e69ead2dacdb6b75e03c23")
null

// 然后查询第二笔交易,发现交易上链,nonce值为13
> eth.getTransaction("0xab538aaded6f1232b2198b3b508b910367c73af20cfd2d0ad0117faa6b8aadaf")
{
  blockHash: "0x16ae951cc721901b6abc63edfed1dcc8292f43f41aa7c6597a92fe4da08de281",
  blockNumber: 3486174,
  from: "0xac965f9832efd7684bbbd7ceed5891a337bca302",
  gas: 21000,
  gasPrice: 88000000000,
  hash: "0xab538aaded6f1232b2198b3b508b910367c73af20cfd2d0ad0117faa6b8aadaf",
  input: "0x",
  nonce: 13,
  r: "0xfe5cd567b5c372a9187fde81bd82690423c85554d0626a64dee007793341774b",
  s: "0x3642a005f1a2c7801b8ac635fce0c7995c4d41a758cf80fef3d727506d292afe",
  to: "0x6e60f5243e1a3f0be3f407b5afe9e5395ee82aa2",
  transactionIndex: 0,
  type: "0x0",
  v: "0x539bb",
  value: 3000000000000000000
}

总结

总结一下:

  • 1、以太坊中有两种nonce,一种是在区块中的nonce,主要是调整挖矿难度;一种是每笔交易中nonce。
  • 2、每个外部账户(私钥控制的账户)都有一个nonce值,从0开始连续累加,每累加一次,代表一笔交易。
  • 3、某一地址的某一交易的nonce值如果大于当前的nonce,该交易会被放到交易池的queued列表中,直到缺失的nonce被提交到交易池中。
  • 4、地址的nonce值是一个连续的整数,设计的主要目的是防止双花。
  • 5、在发生一笔交易时,如果不指定nonce值时,节点会根据当前交易池的交易自动计算该笔交易的nonce。有可能会出现节点A和节点B计算的nonce值不一样的情况。
  • 6、当交易暂未上链时,可通过提高手续费的方式,覆盖同样nonce值的交易
  • 7、通常情况下,覆盖掉一笔处于pending状态的交易gas price需要高于原交易的110%。

关于Nonce的保管

依赖节点

  • 优点:

如果该热点账户的私钥信息等都存放在Ethereum客户端中,那么在发送交易的时候不传递nonce值,Ethereum客户端会帮你处理好此nonce值的排序。

  • 缺点:

当然,此方案有两个弊端。第一个是安全性无法保障(未进行冷热账户分离),第二,在热点账户下如果想覆盖掉一笔交易,需要先查询一下该交易的信息,从中获取nonce值。

自行管理nonce

  • 优点:

通过数据库进行管理nonce,在每一次发布成功的交易都做一次++操作,并且在数据库保存对当前这笔交易的nonce保管,以方便自己追踪当前交易的nonce。

  • 缺点:

此种方案也有限制条件。第一,由于nonce统一进行维护,那么这个地址必须是内部地址,而且发起交易必须通过统一维护的nonce作为出口,否则在其他地方发起交易,原有维护的nonce将会出现混乱。第二,一旦已经发出的交易发生异常,异常交易的nonce未被使用,那么异常交易的nonce需要重新被使用之后它后面的nonce才会生效。

注:可获取当前地址发起交易的eth_getTransactionCount 参数为地址,以及Pending或者lastest,选用pending就行, 就可以获取你当前地址的最大nonce数。 但是这种情况需要确保你中间的nonce没有中断过。

例如:

# curl -H Content-Type:application/json -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0xac965f9832efd7684bbbd7ceed5891a337bca302","pending"],"id":1}' http://127.0.0.1:8545
{"jsonrpc":"2.0","id":1,"result":"0xe"}

参考代码

https://github.com/ethereum/go-ethereum/blob/86e77900c53ebce3309099a39cbca38eb4d62fdf/core/tx_pool.go

一笔交易调用add(ctx context.Context, tx *types.Transaction)方法将交易信息加入到交易池的pending列表中,需要对交易信息进行验证,验证方法是validateTx,如下所示:

// validateTx checks whether a transaction is valid according to the consensus
// rules and adheres to some heuristic limits of the local node (price and size).
func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error {
    // Heuristic limit, reject transactions over 32KB to prevent DOS attacks
    if tx.Size() > 32*1024 {
        return ErrOversizedData
    }
    ...
    // Ensure the transaction adheres to nonce ordering
    if pool.currentState.GetNonce(from) > tx.Nonce() {
        return ErrNonceTooLow
    }
    ...
}

使用GetNonce方法获取当前地址在交易池中的nonce值,如果当前交易的nonce比交易池中的nonce值小,就会报“nonce too low”的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于以太坊的nonce值 的相关文章

  • 以太坊智能合约虚拟机(EVM)原理与实现

    以太坊 EVM原理与实现 以太坊底层通过EVM模块支持合约的执行与调用 调用时根据合约地址获取到代码 生成环境后载入到EVM中运行 通常智能合约的开发流程是用solidlity编写逻辑代码 再通过编译器编译元数据 最后再发布到以太坊上 代码
  • UniswapV2核心合约学习(3)——UniswapV2Pair.sol

    记得朋友圈看到过一句话 如果Defi是以太坊的皇冠 那么Uniswap就是这顶皇冠中的明珠 Uniswap目前已经是V2版本 相对V1 它的功能更加全面优化 然而其合约源码却并不复杂 本文为个人学习UniswapV2核心合约源码的系列文章的
  • web3j的基础用法-3ETH交易监听器

    ETH的交易监听器 demo简单实现了4种 监听区块 public Subscription subscribeBlock final Action1
  • 笔记:以太坊geth客户端命令及参数

    geth命令的参数 nodiscover 使用此选项可确保未手动添加您的人员无法发现您的节点 否则 如果您的节点具有相同的创世纪文件和网络ID 则可能无意中将您的节点添加到陌生人的区块链中 maxpeers 0 如果您不希望任何其他人连接到
  • 以太坊控制台基本命令行操作

    创建账户 personal newAccount 123456 输入的参数是该账户对应的密码 账户地址保存在主目录下的keystore目录中 查询系统中的账户 personal listAccounts eth accounts 这个两个命
  • 不要再在以太坊和Metamask开发web时使用密码

    我在ConsenSys为各种客户构建了大量的概念证明 通常他们想要利用以太坊区块链来解决某些业务用例 奇怪的是 这些系统通常设计有标准的网络登录 即用户名和密码 我总是问自己为什么我还在这样做设计 毕竟 这是今天以太网目前可以解决每个烦人的
  • 用Go构建一个简单的区块链

    在本教程中 我将尝试通过帮助你在Go中编写简单的区块链来揭开区块链的广义概念 在本教程中 你应该能够 理解区块链术语 创建自己的简单区块链 了解什么是区块以及如何创建块 了解如何维护区块链的完整性 区块链 一种数字分类帐 以较小的集合排列
  • 使用Go语言和以太坊智能合约交互

    尽管最近遇到了些麻烦 但以太坊仍然是区块链领域内智能合约的最大参与者 这似乎不会很快改变 在我看来 技术本身具有很大的潜力 是从学术的角度看很有意思 但正如上面提到的问题和之前的许多问题是区块链技术方面的 智能合约 特别是具有Solidit
  • Hyperledger Fabric如何通过虚拟机部署以太坊智能合约

    EVM作为用户链代码安装到Fabric中 然后可以通过它部署智能合约 单个EVM链代码足以在通道上运行多个以太坊智能合约 链码不采用以太坊的共识方法 所有事务仍将遵循Fabric事务流中的执行 订单 验证步骤 确保在不同组织中的足够对等方安
  • 读取本地文件到读出p.node涉及的函数

    这里是读取本地文件的所调用的函数 func ParseNode rawurl string Node error if m incompleteNodeURL FindStringSubmatch rawurl m nil id err H
  • 以太坊的MPT树,以及编码,leveldb存储

    声明 此为使用网上多处资料整理而成 由于很多地方内容相同 已经分不清哪里是原创 一 MPT树 1 Trie树 Trie 又称为字典树或者前缀树 prefix tree 属于查找树的一种 它与平衡二叉树的主要不同点包括 每个节点数据所携带的
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea
  • js连接web3,连接小狐狸metamask钱包,实现链不对后切换网络和创建网络

    直接上代码 我这里吧所有配置都改成正式的链56 一旦用户的小狐狸钱包现在的链不一致 就询问切换网络 没有就创建网络 网络切换成功后 收到监听 重新连接一下web3 就是重新调用一些connectWeb3这个方法 再连接合约 connectW
  • 区块链开发之Solidity编程基础(一)

    Solidy是当前编写智能合约的主流语言 概要 sol文件结构 编译开发 引入其他文件 注释 代码注释 文档注释 合约 状态变量 类型 值类型 1 布尔类型 2 整型 3 地址 4 定长字节数组 5 有理数和整型字面量 6 枚举类型 7 函
  • 区块链的几大模块

    共识的分类 POW POW的一般理解 根据难度做SHA256哈希运算 不停寻找Nonce 特定的HASH 前导0的个数越多 代表难度越大 优点是难于计算 一旦收到网络上的区块 能快速验证 难度算法按高度动态调整 维持出块时间不变 POW规范
  • 以太坊公链节点连接节点超时问题排查

    2020年4月1日晚上8点 zabbix报警 以太坊公链三分钟内没有检测到区块数据同步 立即登录到服务器 查看以太坊公链节点数据同步情况 docker logs f public eth tail 10 INFO 04 01 20 17 3
  • 从Java到区块链:如何成为区块链开发人员

    最近这些天 区块链是每个开发人员的谈资 来自各个领域的许多软件开发商现在正试图进入区块链市场 我们与Mobilunity的区块链软件开发人员Eugene Kyselev 讨论了他是如何走出区块链开发方面的第一步的 希望对大家有所帮助 JAX
  • 以太坊构建DApps系列教程(一):应用程序规则和区块链设置

    这将是一个如何使用以太坊区块链构建去中心化应用程序DApps的系列教程 第一篇教程重点介绍应用程序的规则和功能以及设置私有区块链 展示在使用或不使用DAO和应用程序的情况下如何构建自己自定义的以太坊代币 我们要构建3件事 自定义代币 使用代
  • 将随机数添加到脚本标签

    我想向动态构造的脚本标记添加一个随机数 下面的代码不会向生成的脚本标签添加任何随机数 有人知道如何添加随机数吗 var wss document createElement script wss nonce random string ws
  • 如何处理 AES CTR 的 IV/Nonce/Counter?

    import javax crypto Cipher public abstract class Crypto private static final String CIPHER ALGORITHM AES CTR NoPadding p

随机推荐

  • 如何实现自适应

    如何实现自适应 利用视口单位实现适配布局 响应式布局的实现依靠媒体查询 Media Queries 来实现 选取主流设备宽度尺寸作为断点针对性写额外的样式进行适配 但这样做会比较麻烦 只能在选取的几个主流设备尺寸下呈现完美适配 即使是通过
  • 英文常见姓氏列表

    写论文时需要统一参考文献格式 外国人的名字经常分不清姓和名 这里汇总了大部分的外国人姓 美国人 1 史密斯 Smith 这一姓氏源自一种职业 是从事金属加工业的男士的姓氏 smith本身有铁匠或锻工之意 金属加工是最初几个对专业能力有特定要
  • 夜莺(Flashcat)V6监控(二):夜莺页面全网最详细功能介绍及案列

    目录 一 如何把数据转发给多个时序库 二 监控仪表盘的配置 三 告警的配置管理 1 告警规则 基础配置 规则配置 分为Metric和Host机器类型的告警 生成配置 通知配置 2 内置规则 3 屏蔽规则 4 订阅规则 5 活跃告警 6 历史
  • Python编程 从入门到实践 12-4

    12 4 按键 创建一个程序 显示一个空屏幕 在事件循环中 每当检测到 pygame KEYDOWN 事件时都打印属性 event key 运行这个程序 并按各种键 看看 Pygame如何响应 import sys import pygam
  • node多版本安装--nvm丝滑切换node版本

    以下是我总结得俩种nvm切换node版本的方式 首先是第一种 需要手动配置的 第一步把自己电脑上面的node卸载 在本机应用程序中卸载 然后手动本机目录删除剩余残留node npm等文件 C Users 86184 AppData C Us
  • 函数的极值点、零点、驻点、拐点的理解

    总结 零点 函数值为0的点 极值点 函数单调性发生变化的点 驻点 函数的一阶导数为0的点 拐点 函数凹凸性变化的点 学习链接 https wenku baidu com view 4a009cf5650e52ea5418982e html
  • [工程数学]1_特征值与特征向量

    首先向b站up DR CAN致敬 视频二刷了 为了收获 理解更多 用极慢的方式 把笔记抄了下来 整理一遍 为了好翻阅 后续会转成pdf格式 放微信公众号后台获取 现代控制理论 2 state space状态空间方程 在state space
  • java是什么_Java是什么?Java有什么用?

    我们经常提到Java 很多小白只听说过但对其并没有太多具体的了解 那么Java是什么 Java有什么用 今天就来探讨一下 我们常常会听说 Java是世界第一语言 很多应用软件的开发都离不开Java Java真的这么强大吗 其实 Java的内
  • 多链路传输技术在火山引擎 RTC 的探索和实践

    动手点关注 干货不迷路 传统的数据传输方式大多是利用一个链路 选择设备的默认网卡进行传输 使用这种方式实现实时音视频通话时 如果默认网络出现问题 如断网 弱网等 用户的通信就会发生中断或者卡顿 影响用户体验 多链路传输 顾名思义 就是使用多
  • electron_vue—实现消息通知 及 解决通知不显示问题

    实现消息通知 window linux macOS 这三个操作系统都为应用程序提供了向用户发送通知的方法
  • python使用pip安装出现pip is configured with locations that require TLS/SSL异常处理方法

    问题描述 最近给服务器安装python环境 通过源码方式安装Python3 8之后 使用pip功能出现异常 提示 root localhost pip3 install you get pip is configured with loca
  • 大数据处理中的关键算子:分割(Split)和选择(Select)

    在大数据处理中 分割 Split 和选择 Select 是两个常用的算子 它们在数据转换和处理过程中发挥着重要的作用 本文将详细介绍这两个算子的功能和使用方法 并附上相应的源代码示例 1 分割 Split 分割算子用于将一个数据集拆分成多个
  • 图的深度遍历和广度遍历

    理论部分 图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历 如下面的图 可以用右边的邻接矩阵进行表示 假设以顶点0开始对整幅图进行遍历的话 两种遍历方式的思想如下 1 深度优先遍历 depthFirstSearch DFS
  • LISN到底是啥?干啥用的?

    LISN到底是啥 干啥用的 LISN是在EMC测试的时候 会被使用的设备 如下图所示 双路V型电源阻抗稳定网络 它完全符合CISPR16 1 2 MIL STD 461F VDE 0876 FCC Part 15标准的要求 其等效电路为50
  • 20191004

    A 解 1 我们发现只需要关心处于结果字符串前 k 位的字符 因此考虑从后往前处理 对于一个询问区间 我们暴力连边 用并查集维护 x 的父亲等于 y 相当于位于 x 的字符是从位于 y 的字符处复制过来的 然后删掉这个区间 更新其他元素的排
  • Hutool BeanUtils.copyProperties的四种用法 空不拷贝/忽略拷贝/空不和忽略拷贝/全拷贝

    关注公众号 奇叔码技术 回复 java面试题大全 或者 java面试题 即可领取资料 一 Hutool BeanUtils copyProperties的四种用法 空不拷贝 忽略拷贝 空不和忽略拷贝 全拷贝 1 第一种用法 BeanUtil
  • STM32-CubeMX学习笔记

    例程参考链接 http bbs elecfans com jishu 714935 1 1 html 1 首次使用参见文档 http blog csdn net tq384998430 article details 53466263 2
  • 彻底搞懂Java中的synchronized关键字

    synchronized的作用 synchronized 的作用主要有三 原子性 所谓原子性就是指一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断 要么就都不执行 被synchronized修饰的类或对象的所有操作都是原子
  • 【歪门邪道】懒得麻烦UI同学切图所以用AndroidStudio生成icon

    每次新建项目 是不是都默认生成一个 ic launcher 对于这个icon 你是不是从来都是一删了事 你有没有一次 打开并留意过里头 ic launcher foreground 和 ic launcher background 文件 如
  • 关于以太坊的nonce值

    文章目录 每笔交易nonce值的各个情况 总结 关于Nonce的保管 依赖节点 自行管理nonce 参考代码 nonce在区块链中是一个非常重要的概念 从比特币到以太坊都有nonce的身影 在比特币中 nonce主要用于调整pow挖矿的难度