当前位置: 首页 > news >正文

Cosmos 基础教程(二)-- Run a Node, API, and CLI

有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。

1、编译simapp

Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中,您可以找到运行Cosmos SDK模拟版本的代码,这样您就可以在不实际与链交互的情况下测试命令。二进制文件称为simd,您将使用它与节点交互。

首先,创建目录并将其更改为cosmos文件夹,然后将cosmos-sdk repo复制到该文件夹中:

$ mkdir cosmos
$ cd cosmos
$ git clone https://github.com/cosmos/cosmos-sdk
$ cd cosmos-sdk

请确保您使用的是相同版本:

$ git checkout v0.42.6

然后构建cosmos-sdk:

$ make build

构建需要几分钟,并创建一个build 文件夹和一个名为simdsimapp二进制文件:

$ ls build

2、初始化 simapp

现在重置数据库。不仅在数据库已经初始化时运行此步骤,而且即使这是您第一次测试simapp:

$ cd build
$ ./simd unsafe-reset-all

命令输出列出了设置为初始状态的所有文件及其位置。
在这里插入图片描述
是时候初始化应用程序了。初始化创建了创世块和初始链状态:

$ ./simd init demo

在这里插入图片描述

一个更易读的版本:

{"app_message": {"auth": {"accounts": [ ], "params": {"max_memo_characters": "256", "sig_verify_cost_ed25519": "590", "sig_verify_cost_secp256k1": "1000", "tx_sig_limit": "7", "tx_size_cost_per_byte": "10"}}, "bank": {"balances": [ ], "denom_metadata": [ ], "params": {"default_send_enabled": true, "send_enabled": [ ]}, "supply": [ ]}, "capability": {"index": "1", "owners": [ ]}, "crisis": {"constant_fee": {"amount": "1000", "denom": "stake"}}, "distribution": {"delegator_starting_infos": [ ], "delegator_withdraw_infos": [ ], "fee_pool": {"community_pool": [ ]}, "outstanding_rewards": [ ], "params": {"base_proposer_reward": "0.010000000000000000", "bonus_proposer_reward": "0.040000000000000000", "community_tax": "0.020000000000000000", "withdraw_addr_enabled": true}, "previous_proposer": "", "validator_accumulated_commissions": [ ], "validator_current_rewards": [ ], "validator_historical_rewards": [ ], "validator_slash_events": [ ]}, "evidence": {"evidence": [ ]}, "genutil": {"gen_txs": [ ]}, "gov": {"deposit_params": {"max_deposit_period": "172800s", "min_deposit": [{"amount": "10000000", "denom": "stake"}]}, "deposits": [ ], "proposals": [ ], "starting_proposal_id": "1", "tally_params": {"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto_threshold": "0.334000000000000000"}, "votes": [ ], "voting_params": {"voting_period": "172800s"}}, "ibc": {"channel_genesis": {"ack_sequences": [ ], "acknowledgements": [ ], "channels": [ ], "commitments": [ ], "next_channel_sequence": "0", "receipts": [ ], "recv_sequences": [ ], "send_sequences": [ ]}, "client_genesis": {"clients": [ ], "clients_consensus": [ ], "clients_metadata": [ ], "create_localhost": false, "next_client_sequence": "0", "params": {"allowed_clients": ["06-solomachine", "07-tendermint"]}}, "connection_genesis": {"client_connection_paths": [ ], "connections": [ ], "next_connection_sequence": "0"}}, "mint": {"minter": {"annual_provisions": "0.000000000000000000", "inflation": "0.130000000000000000"}, "params": {"blocks_per_year": "6311520", "goal_bonded": "0.670000000000000000", "inflation_max": "0.200000000000000000", "inflation_min": "0.070000000000000000", "inflation_rate_change": "0.130000000000000000", "mint_denom": "stake"}}, "params": null, "slashing": {"missed_blocks": [ ], "params": {"downtime_jail_duration": "600s", "min_signed_per_window": "0.500000000000000000", "signed_blocks_window": "100", "slash_fraction_double_sign": "0.050000000000000000", "slash_fraction_downtime": "0.010000000000000000"}, "signing_infos": [ ]}, "staking": {"delegations": [ ], "exported": false, "last_total_power": "0", "last_validator_powers": [ ], "params": {"bond_denom": "stake", "historical_entries": 10000, "max_entries": 7, "max_validators": 100, "unbonding_time": "1814400s"}, "redelegations": [ ], "unbonding_delegations": [ ], "validators": [ ]}, "transfer": {"denom_traces": [ ], "params": {"receive_enabled": true, "send_enabled": true}, "port_id": "transfer"}, "upgrade": { }, "vesting": { }}, "chain_id": "test-chain-Hrbd7m", "gentxs_dir": "", "moniker": "demo", "node_id": "93d73b7f8fc1b74612146ba2342e54293c018b9a"
}

您可以在输出中找到chain_id,在我们的构建中,它恰好被称为test-chain-Hrbd7m。记下输出的名称,因为稍后将需要它来确定链 ID,通过标记--chain-id将其传递给simapp

您可以通过以下命令检查初始配置:

$ cat ~/.simapp/config/genesis.json

3、准备你的帐户(account)

It helps to understand the concepts clearly when working hands-on with the Cosmos SDK. Need a refresher? See the section on Accounts in the Main Concepts chapter.

在实际使用Cosmos SDK时,它有助于清楚地理解这些概念。需要复习吗?请参阅“主要概念”一章中的“帐户”部分。

你也可以检查你的keys。它们保存在后端密匙环中,默认情况下是操作系统的密匙环:

$ ./simd keys list

正如你所预料的,你还没有任何keys:

[]

在这里插入图片描述

现在你可以添加一个新key:

$ ./simd keys add d9lab

它输出类似于:

[root@localhost build]# ./simd keys add d9lab
Enter keyring passphrase:
password must be at least 8 characters
Enter keyring passphrase:
Re-enter keyring passphrase:- name: d9labtype: localaddress: cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8pubkey: cosmospub1addwnpepq0z9q7hy5t050r85r6u9cqgr82uhadg4dx7my7ktgfx6ue4htlfwzg767zhmnemonic: ""threshold: 0pubkeys: []**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.surface mom fiction tuna chase blanket work useful lucky confirm snap crystal peanut enrich sadness heavy voyage bachelor night crazy bargain original prefer else

您可以在上面输出的末尾看到助记符。这个单词序列是一个助记符,您可以使用它来恢复您的公钥和私钥。在生产环境中,助记符必须以可靠和保密的方式存储,作为密钥管理基础设施的一部分。

确认密钥已添加:

$ ./simd keys list
# 或
$ ./simd keys show d9lab

在这里插入图片描述

4、让自己成为一个合适的验证者

如前所述,Cosmos SDK区块链依赖于已识别的验证器来生成块。最初没有用于生成块的验证器。您处于进退两难的境地:初始化和未启动的链需要一个genesis帐户和验证器来进行引导。

让你的key,也就是账户,在创世文件中有一个初始余额:

$ ./simd add-genesis-account d9lab 100000000stake

这里附加在金额后面的是stake 后缀。根据创世文件,这个stake 代表这个链中tokens 的单位。因此,该命令将向您的帐户添加100000000 stake 。如果有疑问,你可以确认genesis.json文件中的正确后缀。

grep -A 2 -B 2 denom ~/.simapp/config/genesis.json

你也可以在创世纪文件中确认你有一个初始余额:

$ grep -A 10 balances ~/.simapp/config/genesis.json

尽管有这个初始余额,在你运行你的区块链之前,你仍然需要逃脱第22条军规,并将你的引导交易包含在genesis文件中。

在这种情况下,为了使网络能够运行,您必须满足加权验证器的2/3阈值。
然而,你将是一个人在网络上,所以你可以下注任何数字或高于最低强制,即1000000stake。但是,为了提醒自己诚实的节点投入大量资金是很重要的,您将100000000股份中的70000000股份投入到您刚刚创建的b9lab帐户中。确保不要用完你所有的代币,这样你仍然可以支付gas ,这样你以后就不会用完代币。
别忘了用你自己的--chain-id

./simd gentx d9lab 70000000stake --chain-id test-chain-Hrbd7m

这证实了这一行动:
在这里插入图片描述

当你在自己的文件中创建了这个genesis交易后,用collect-gentxs收集所有的genesis交易,将其包含在你的genesis文件中:

$ ./simd collect-gentxs

打印生成的genesis文件:

{"app_message": {"auth": {"accounts": [{"@type": "/cosmos.auth.v1beta1.BaseAccount", "account_number": "0", "address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "pub_key": null, "sequence": "0"}], "params": {"max_memo_characters": "256", "sig_verify_cost_ed25519": "590", "sig_verify_cost_secp256k1": "1000", "tx_sig_limit": "7", "tx_size_cost_per_byte": "10"}}, "bank": {"balances": [{"address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "coins": [{"amount": "100000000", "denom": "stake"}]}], "denom_metadata": [ ], "params": {"default_send_enabled": true, "send_enabled": [ ]}, "supply": [{"amount": "100000000", "denom": "stake"}]}, "capability": {"index": "1", "owners": [ ]}, "crisis": {"constant_fee": {"amount": "1000", "denom": "stake"}}, "distribution": {"delegator_starting_infos": [ ], "delegator_withdraw_infos": [ ], "fee_pool": {"community_pool": [ ]}, "outstanding_rewards": [ ], "params": {"base_proposer_reward": "0.010000000000000000", "bonus_proposer_reward": "0.040000000000000000", "community_tax": "0.020000000000000000", "withdraw_addr_enabled": true}, "previous_proposer": "", "validator_accumulated_commissions": [ ], "validator_current_rewards": [ ], "validator_historical_rewards": [ ], "validator_slash_events": [ ]}, "evidence": {"evidence": [ ]}, "genutil": {"gen_txs": [{"auth_info": {"fee": {"amount": [ ], "gas_limit": "200000", "granter": "", "payer": ""}, "signer_infos": [{"mode_info": {"single": {"mode": "SIGN_MODE_DIRECT"}}, "public_key": {"@type": "/cosmos.crypto.secp256k1.PubKey", "key": "A8RQeuSi30eM9B64XAEDOrl+tRVpvbJ6y0JNrma3X9Lh"}, "sequence": "0"}]}, "body": {"extension_options": [ ], "memo": "93d73b7f8fc1b74612146ba2342e54293c018b9a@192.168.159.128:26656", "messages": [{"@type": "/cosmos.staking.v1beta1.MsgCreateValidator", "commission": {"max_change_rate": "0.010000000000000000", "max_rate": "0.200000000000000000", "rate": "0.100000000000000000"}, "delegator_address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "description": {"details": "", "identity": "", "moniker": "demo", "security_contact": "", "website": ""}, "min_self_delegation": "1", "pubkey": {"@type": "/cosmos.crypto.ed25519.PubKey", "key": "DWOymvjGcTdP+emo7k1kdqsWzxgwimMOXpqh7Lw2pe0="}, "validator_address": "cosmosvaloper12uj7a02737k7j0d53lhf2eectfktf78v6w3c45", "value": {"amount": "70000000", "denom": "stake"}}], "non_critical_extension_options": [ ], "timeout_height": "0"}, "signatures": ["s5x2n/lLuGAOUq0YdJRkxVY5WtcbVt5wZJ4uRUuQ02ULje9czOPikEWFFOm9Bb69GHZBpw0VP9AwbuSzzIGxhA=="]}]}, "gov": {"deposit_params": {"max_deposit_period": "172800s", "min_deposit": [{"amount": "10000000", "denom": "stake"}]}, "deposits": [ ], "proposals": [ ], "starting_proposal_id": "1", "tally_params": {"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto_threshold": "0.334000000000000000"}, "votes": [ ], "voting_params": {"voting_period": "172800s"}}, "ibc": {"channel_genesis": {"ack_sequences": [ ], "acknowledgements": [ ], "channels": [ ], "commitments": [ ], "next_channel_sequence": "0", "receipts": [ ], "recv_sequences": [ ], "send_sequences": [ ]}, "client_genesis": {"clients": [ ], "clients_consensus": [ ], "clients_metadata": [ ], "create_localhost": false, "next_client_sequence": "0", "params": {"allowed_clients": ["06-solomachine", "07-tendermint"]}}, "connection_genesis": {"client_connection_paths": [ ], "connections": [ ], "next_connection_sequence": "0"}}, "mint": {"minter": {"annual_provisions": "0.000000000000000000", "inflation": "0.130000000000000000"}, "params": {"blocks_per_year": "6311520", "goal_bonded": "0.670000000000000000", "inflation_max": "0.200000000000000000", "inflation_min": "0.070000000000000000", "inflation_rate_change": "0.130000000000000000", "mint_denom": "stake"}}, "params": null, "slashing": {"missed_blocks": [ ], "params": {"downtime_jail_duration": "600s", "min_signed_per_window": "0.500000000000000000", "signed_blocks_window": "100", "slash_fraction_double_sign": "0.050000000000000000", "slash_fraction_downtime": "0.010000000000000000"}, "signing_infos": [ ]}, "staking": {"delegations": [ ], "exported": false, "last_total_power": "0", "last_validator_powers": [ ], "params": {"bond_denom": "stake", "historical_entries": 10000, "max_entries": 7, "max_validators": 100, "unbonding_time": "1814400s"}, "redelegations": [ ], "unbonding_delegations": [ ], "validators": [ ]}, "transfer": {"denom_traces": [ ], "params": {"receive_enabled": true, "send_enabled": true}, "port_id": "transfer"}, "upgrade": { }, "vesting": { }}, "chain_id": "test-chain-Hrbd7m", "gentxs_dir": "/root/.simapp/config/gentx", "moniker": "demo", "node_id": "93d73b7f8fc1b74612146ba2342e54293c018b9a"
}

如果您感到好奇,您可以在您的genesis中找到更新的gen_txs字段。

"genutil": {"gen_txs": [{"auth_info": {"fee": {"amount": [ ], "gas_limit": "200000", "granter": "", "payer": ""}, "signer_infos": [{"mode_info": {"single": {"mode": "SIGN_MODE_DIRECT"}}, "public_key": {"@type": "/cosmos.crypto.secp256k1.PubKey", "key": "A8RQeuSi30eM9B64XAEDOrl+tRVpvbJ6y0JNrma3X9Lh"}, "sequence": "0"}]}, "body": {"extension_options": [ ], "memo": "93d73b7f8fc1b74612146ba2342e54293c018b9a@192.168.159.128:26656", "messages": [{"@type": "/cosmos.staking.v1beta1.MsgCreateValidator", "commission": {"max_change_rate": "0.010000000000000000", "max_rate": "0.200000000000000000", "rate": "0.100000000000000000"}, "delegator_address": "cosmos12uj7a02737k7j0d53lhf2eectfktf78vl69de8", "description": {"details": "", "identity": "", "moniker": "demo", "security_contact": "", "website": ""}, "min_self_delegation": "1", "pubkey": {"@type": "/cosmos.crypto.ed25519.PubKey", "key": "DWOymvjGcTdP+emo7k1kdqsWzxgwimMOXpqh7Lw2pe0="}, "validator_address": "cosmosvaloper12uj7a02737k7j0d53lhf2eectfktf78v6w3c45", "value": {"amount": "70000000", "denom": "stake"}}], "non_critical_extension_options": [ ], "timeout_height": "0"}, "signatures": ["s5x2n/lLuGAOUq0YdJRkxVY5WtcbVt5wZJ4uRUuQ02ULje9czOPikEWFFOm9Bb69GHZBpw0VP9AwbuSzzIGxhA=="]}]}, 

5、Create blocks

现在你可以启动你的单节点区块链:

$ ./simd start

在你运行命令的终端窗口中,你可以看到块正在生成和验证:

[root@localhost build]# ./simd start
2:30PM INF starting ABCI with Tendermint
2:30PM INF Starting multiAppConn service impl=multiAppConn module=proxy
2:30PM INF Starting localClient service connection=query impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=snapshot impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=mempool impl=localClient module=abci-client
2:30PM INF Starting localClient service connection=consensus impl=localClient module=abci-client
2:30PM INF Starting EventBus service impl=EventBus module=events
2:30PM INF Starting PubSub service impl=PubSub module=pubsub
2:30PM INF Starting IndexerService service impl=IndexerService module=txindex
2:30PM INF ABCI Handshake App Info hash= height=0 module=consensus protocol-version=0 software-version=
2:30PM INF ABCI Replay Blocks appHeight=0 module=consensus stateHeight=0 storeHeight=0
2:30PM INF asserting crisis invariants inv=0/11 module=x/crisis name=staking/module-accounts

在同一文件夹中打开一个新终端,并检查余额:

$ ./simd query bank balances $(./simd keys show d9lab -a)

打印:
在这里插入图片描述

6、发送交易

练习发送交易。要做到这一点,你将创建另一个名为student的帐户,并将一些tokens 转移到该帐户:

$ ./simd keys add student

打印如下:

[root@localhost build]# ./simd keys add student
Enter keyring passphrase:- name: studenttype: localaddress: cosmos1h43mcjku2a008jq9pqqzcd75gry7tsuutcn374pubkey: cosmospub1addwnpepqd7vfdq7tcyzqlg9vwwg8c2ef0pzwqajpktekgwrdxgxlhz4s6jfqmek9j0mnemonic: ""threshold: 0pubkeys: []**Important** write this mnemonic phrase in a safe place.
It is the only way to recover your account if you ever forget your password.vague tuition armor crane picture business organ balance strike town plate target rain provide depend weapon indoor logic uncover track puppy coral effort donate

在发送任何代币之前,请确认新账户的余额是否存在:

$ ./simd query bank balances $(./simd keys show student -a)

这个账户没有余额。您的区块链中还不存在新帐户。只有密钥对已生成并存储在您的密匙环中:

balances: []
pagination:next_key: nulltotal: "0"

你需要发送一个交易来改变这个新账户的余额:

$ ./simd tx bank send $(./simd keys show d9lab -a) $(./simd keys show student -a) 10stake --chain-id test-chain-Hrbd7m

在签署和广播之前,您将被提示确认交易:
在这里插入图片描述

命令回显信息包括gas_used等有用信息。

先检查一下student账户的余额:

./simd query bank balances $(./simd keys show student -a)

在这里插入图片描述

现在再检查一下student账户的余额:

balances:
- amount: "10"denom: stake
pagination:next_key: nulltotal: "0"

7、CLI路由

现在是时候编写一些Go代码了。simd如何通过命令行界面进行交互?检查cosmos-sdk/simapp/simd/main.go文件:

package mainimport ("os""github.com/cosmos/cosmos-sdk/server"svrcmd "github.com/cosmos/cosmos-sdk/server/cmd""github.com/cosmos/cosmos-sdk/simapp""github.com/cosmos/cosmos-sdk/simapp/simd/cmd"
)func main() {rootCmd, _ := cmd.NewRootCmd()if err := svrcmd.Execute(rootCmd, simapp.DefaultNodeHome); err != nil {switch e := err.(type) {case server.ErrorCode:os.Exit(e.Code)default:os.Exit(1)}}
}

cmd.NewRootCmd()函数是CLI处理程序。它通过“github.com/cosmos/cosmos-sdk/simapp/simd/cmd”行导入。它可以在cosmos-sdk/simapp/simd/cmd/root.go)文件下找到。

func NewRootCmd() (*cobra.Command, params.EncodingConfig)

其中,定义了基本属性,如应用程序名称:

rootCmd := &cobra.Command{Use:   "simd",Short: "simulation app",

此外,观察Cobra被导入并用于CLI重定向:

rootCmd.AddCommand(genutilcli.InitCmd(simapp.ModuleBasics, simapp.DefaultNodeHome),genutilcli.CollectGenTxsCmd(banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome),genutilcli.MigrateGenesisCmd(),genutilcli.GenTxCmd(simapp.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, simapp.DefaultNodeHome),genutilcli.ValidateGenesisCmd(simapp.ModuleBasics),AddGenesisAccountCmd(simapp.DefaultNodeHome),tmcli.NewCompletionCmd(rootCmd, true),NewTestnetCmd(simapp.ModuleBasics, banktypes.GenesisBalancesIterator{}),debug.Cmd(),config.Cmd(),
)

另外,查看simapp/app.go,将导入每个模块和密钥管理员。首先你会看到一个相当大的模块列表(打开新窗口),大多数Cosmos-sdk应用程序都使用这些模块:

..."github.com/cosmos/cosmos-sdk/x/auth""github.com/cosmos/cosmos-sdk/x/auth/ante"authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"authtypes "github.com/cosmos/cosmos-sdk/x/auth/types""github.com/cosmos/cosmos-sdk/x/auth/vesting""github.com/cosmos/cosmos-sdk/x/bank"bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"banktypes "github.com/cosmos/cosmos-sdk/x/bank/types""github.com/cosmos/cosmos-sdk/x/capability"capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
...

/cosmos-sdk/x/文件夹中的模块是由在Cosmos栈上工作的几个组织维护的。要理解一个模块,最好的方法是查看相应的spec文件夹。例如,查看cosmos-sdk/x/bank/spec/01_state.md以了解本节中使用的bank模块的状态。

您是否需要对模块及其在Cosmos SDK中的作用进行概念复习?参见前一章的模块部分。

相关文章:

Cosmos 基础教程(二)-- Run a Node, API, and CLI

有很多不同的方法来运行Cosmos区块链的节点。您将探索如何使用simapp 进行此操作。 1、编译simapp Cosmos SDK存储库包含一个名为 simapp 的文件夹。在这个文件夹中,您可以找到运行Cosmos SDK模拟版本的代码,这样您就可以在不实际与链交互的情况下测试…...

C# 读写xml文件总结 [详细]

C# 读写xml文件总结C#写入xml文件1、XmlDocument2、DataSet对象里的值来生成XML文件3、利用XmlSerializer来将类的属性值转换为XML文件的元素值。示例:写入xml1、创建xml文档2 、增加节点3 、修改节点:4 、删除节点c#读取xml文件C#写入xml文件 1、XmlDo…...

【Java基础】IO流

IO流 最后一定要关闭流,防止资源泄露 字节流 一次读取1字节,8比特 FileInputStream import org.junit.jupiter.api.Test;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class CopyBytes {pub…...

Boolean,Array,Object数据类型(回顾)

Boolean数据类型范围Boolean(value)Object数据类型特点键值对数组特点类数组特点 Boolean数据类型范围 true,false 链接 Boolean(value) 定义:其他类型转布尔类型 六大假值:false,undefined,null,NaN,0…...

Python常见的数据类型

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…...

欠缺知识点罗列

UML五种关系的特点 依赖,关联,组合,聚合,泛化。认识UML类关系——依赖、关联、聚合、组合、泛化 - 腾讯云开发者社区-腾讯云 数据结构- 生成树的定义。 每周学点大数据 | No.17最小生成树 - 腾讯云开发者社区-腾讯云 有向图。 …...

基于springboot+vue的校园社团管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

你了解互联网APP推荐的背后逻辑么(下)?

上篇重点介绍了互联网APP在搜索交互场景下的通用逻辑,让大众对每天离不开的搜索进行了一个普遍介绍。这一篇,我们来聊聊抖音、头条等APP划一划这个动作背后,是怎么做推荐的。推荐的背后,离不开每个用户的数据,而且这个…...

总是跳转到国内版(cn.bing.com)?New Bing使用全攻略

你是否想要使用强大的(被削后大嘘)New Bing? 你是否已经获得了New Bing的使用资格? 你是否在访问www.bing.com/new时提示页面不存在? 你是否在访问www.bing.com时总是重定向到cn.bing.com而使用不了New Bing? New Bi…...

神经网络的基本骨架—nn.Module使用

一、pytorch官网中torch.nn的相关简介可以看到torch.nn中有许多模块:二、Containers模块1、MODULE(CLASS : torch.nn.Module)import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):#nn.Module---所有神经网络模块的…...

面试官:你是怎样进行react组件代码复用的

mixin Mixin 设计模式 Mixin(混入)是一种通过扩展收集功能的方式,它本质上是将一个对象的属性拷贝到另一个对象上面去,可以拷贝多个属性到一个对象上,为了解决代码复用问题。 常用的方法:JQuery 的 exte…...

arxiv2017 | 用于分子神经网络建模的数据增强 SMILES Enumeration

论文标题:SMILES Enumeration as Data Augmentation for Neural Network Modeling of Molecules论文地址:https://arxiv.org/abs/1703.07076代码地址:https://github.com/Ebjerrum/SMILES-enumeration一、摘要摘要中明显提出:先指…...

倒计时2天!TO B人的传统节日,2023年22客户节(22DAY)

去年,2022.02.22,正月二十二星期二,在这个最多2的一天,成功举办了“首届22客户节(22DAY)”,一群To B互联网人相约杭州见证; 癸卯兔年,2023.02.22,让我们再度…...

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

java版工程管理系统Spring CloudSpring BootMybatis实现工程管理系统 工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和…...

数据结构刷题(六):142环形链表II、242有效的字母异位词、383赎金信、349两个数组的交集

1.环形链表II题目链接思路:设置快慢双指针注意:(1)是否有环(快慢双指针是否能碰面也就是相等)(2)环形入口的判断。从头结点出发一个指针,从相遇节点 也出发一个指针&…...

OpenGL学习日记之光照计算

引言 现实生活中的光照极其复杂,而且会收到很多因素的影响,是我们当前计算机的算力无法模拟的。因此我们会根据一些简化的模型来模拟现实光照,这样在可以模拟出近似的光照感受,但是又没有那么复杂的计算。 常用的光照模型有&…...

七大排序经典排序算法

吾日三省吾身:高否?富否?帅否?答曰:否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底,暂时还未开启新语言的学习,但是大同小异,语法都差不多。目录:一.排序定义二.排序…...

设计模式—“对象性能”

面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模式有:Singleton、Flyweight 一、Flyweight 运用共享技术将大量细粒度的对象进项复用,…...

基于Spring Boot的零食商店

文章目录项目介绍主要功能截图:登录后台首页个人信息管理用户管理前台首页购物车部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关…...

Python语言的优缺点

为初学者而著!适合准备入行开发的零基础员学习python。python也是爬虫、大数据、人工智能等知识的基础。感兴趣的小伙伴可以评论区留言,领取视频教程资料和小编一起学习,共同进步!https://www.bilibili.com/video/BV13D4y1G7pt/?…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言: 类加载器 1. …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

sshd代码修改banner

sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾: 热力图 作业:对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图,展示模…...