安装$ sudo apt install git #两个都安装命令git init # 初始化本地git仓库（创建新仓库） git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxx@xxx.com" # 配置邮件 git config --global color.ui true # git status等命令自动着色 git config --global color.status auto git config --global color.diff auto git config --global color.branch auto git config --global color.interactive auto git config --global --unset http.proxy # remove proxy configuration on git git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库 git status # 查看当前版本状态（是否修改） git add xyz # 添加xyz文件至index git add . # 增加当前子目录下所有更改过的文件至index git commit -m 'xxx' # 提交 git commit --amend -m 'xxx' # 合并上一次提交（用于反复修改） git commit -am 'xxx' # 将add和commit合为一步 git rm xxx # 删除index中的文件 git rm -r * # 递归删除 git log # 显示提交日志 git log -1 # 显示1行日志 -n为n行 git log -5 git log --stat # 显示提交日志及相关变动文件 git log -p -m git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容 git show dfb02 # 可只用commitid的前几位 git show HEAD # 显示HEAD提交日志 git show HEAD^ # 显示HEAD的上一个版本的提交日志 ^^为上两个版本 ^5为上5个版本 git tag # 显示已存在的tag git tag -a v2.0 -m 'xxx' # 增加v2.0的tag git show v2.0 # 显示v2.0的日志及详细内容 git log v2.0 # 显示v2.0的日志 git diff # 显示所有未添加至index的变更 git diff --cached # 显示所有已添加index但还未commit的变更 git diff HEAD^ # 比较与上一个版本的差异 git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 git diff origin/master..master --stat # 只显示差异的文件，不显示具体内容 git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义（用于push/pull/fetch） git branch # 显示本地分支 git branch --contains 50089 # 显示包含提交50089的分支 git branch -a # 显示所有分支 git branch -r # 显示所有原创分支 git branch --merged # 显示所有已合并到当前分支的分支 git branch --no-merged # 显示所有未合并到当前分支的分支 git branch -m master master_copy # 本地分支改名 git checkout -b master_copy # 从当前分支创建新分支master_copy并检出 git checkout -b master master_copy # 上面的完整版 git checkout features/performance # 检出已存在的features/performance分支 git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支 git checkout v2.0 # 检出版本v2.0 git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出 git checkout -- README # 检出head版本的README文件（可用于修改错误回退） git merge origin/master # 合并远程master分支至当前分支 git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改 git push origin master # 将当前分支push到远程master分支 git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支 git push --tags # 把所有tag推送到远程仓库 git fetch # 获取所有远程分支（不更新本地分支，另需merge） git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支 git pull origin master # 获取远程分支master并merge到当前分支 git mv README README2 # 重命名文件README为README2 git reset --hard HEAD # 将当前版本重置为HEAD（通常用于merge失败回退） git rebase git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933（本分支修改已合并到其他分支） git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933 git ls-files # 列出git index包含的文件 git show-branch # 图示当前分支历史 git show-branch --all # 图示所有分支历史 git whatchanged # 显示提交历史对应的文件修改 git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交 git ls-tree HEAD # 内部命令：显示某个git对象 git rev-parse v2.0 # 内部命令：显示某个ref对于的SHA1 HASH git reflog # 显示所有提交，包括孤立节点 git show HEAD@{5} git show master@{yesterday} # 显示master分支昨天的状态 git log --pretty=format:'%h %s' --graph # 图示提交日志 git show HEAD~3 git show -s --pretty=raw 2be7fcb476 git stash # 暂存当前修改，将所有至为HEAD状态 git stash list # 查看所有暂存 git stash show -p stash@{0} # 参考第一次暂存 git stash apply stash@{0} # 应用第一次暂存 git grep "delete from" # 文件中搜索文本“delete from” git grep -e '#define' --and -e SORT_DIRENT git gc git fsck
一、简介cosmos使用gov模块来提供链上治理功能，让代币持有人拥有共同治理区块链的能力，用户可以通过这个模块提供的接口进行以下操作：提交提案：任意用户可以缴纳押金发起提案。一旦达到最低押金，提案就进入投票期投票：拥有投票权的用户可以对进入投票期的提案进行投票，有四种投票选项：支持、反对、弃权、否决提案查询：查询提案，每一个提交过的提案都有一个唯一ID，通过这个ID可以查询提案内容和投票详情二、提案提案包括以下类型：text：纯文本提案community-pool-spend：社区池资金申请software-upgrade：软件升级cancel-software-upgrade：取消软件升级other：其他交易消息，包括参数更新消息cosmos的一笔交易里面可以包含多个消息调用，有些消息用户不能直接发送，可以由提案发起，比如说模块参数更新除了纯文本的提案，其他提案会包含对应的消息调用，如果提案被通过，将会自动执行消息调用，gov模块有一些治理相关的参数，其他模块也可以提供自己的参数。这些参数包括：min_deposit：最低存款押金min_initial_deposit_ratio：最低初始化存款押金，发起提议时通过的存款max_deposit_period：存款最大持续时间voting_period：投票持续时间quorum：法定人数，参与投票的权重比例，低于这个比例的投票无效threshold：阈值：同意的票所占比例veto_threshold：否决阈值，否决的票所占比例一般来说，模块的参数更新消息为/cosmos.<模块名称>.v1.MsgUpdateParams，比如治理模块的参数更新消息为/cosmos.gov.v1.MsgUpdateParams之前有params模块，现在已经删除，之前cosmos采用消息/cosmos.params.v1beta1.ParameterChangeProposal来统一更新模块参数，现在各个模块自己提供消息接口三、流程1、存款阶段用户发起提案之后，开启存款阶段，对于想要进入下一个阶段的提案，需要在指定时间内存入足够押金。提案的提交方不一定自己存入押金，其他人愿意支付也可以。任何代币持有者都可以发起提案，也可以为提案存入押金2、投票阶段如果提案在指定时间内满足最低存款要求，那么立刻进入投票阶段，在此期间，代币持有人可对该提案进行投票，有4个投票选项：支持、反对、弃权、否决提案。只有权益币有投票权，没有委托质押的币投票无效投票时一币一票，委托的币越多，投票的权重越大投票时不会损失或者锁定币，只会根据当前用户质押的币计算投票权重委托者可以继承验证者的投票，除非委托者自己有过投票。如果委托者自己投票的话，将会覆盖验证者的投票3、执行阶段提案被接受至少需要满足如下条件：法定人数：在投票结束的时候，超过指定数量的权益代币需要参与投票阈值：超过指定比例的参与投票的代币需要支持该提案否决阈值：低于指定比例的参与投票的代币对最终决定选择了否决提案如果在投票阶段结束后没有满足以上条件，则提案无法通过，如果提案被接受，提案中的消息将被执行如果提案被批准或拒绝，那么提案的押金将会自动退回各自的存款人；如果提案被否决，押金将被销毁；如果存款阶段结束时未达到最低存款需求，押金将被销毁四、命令行接口运行一个测试链，并且以修改gov模块参数为例1、准备提案json文件chaind tx gov draft-proposal进入提案交互模式，先选择其他类型再选择/cosmos.gov.v1.MsgUpdateParams消息接下来按提示输入提案信息和存入押金的数量，下面是控制台输出示例✔ other ✔ /cosmos.gov.v1.MsgUpdateParams Enter proposal's title: a Enter proposal's authors: a Enter proposal's summary: a Enter proposal's details: a Enter proposal's proposal forum url: http://a.a Enter proposal's vote option context: a Enter proposal deposit: 1000stake ✔ Enter msg's authority: cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn The draft proposal has successfully been generated. Proposals should contain off-chain metadata, please upload the metadata JSON to IPFS. Then, replace the generated metadata field with the IPFS CID.命令执行结束后会生成元信息文件draft_metadata.json和提案信息文件draft_proposal.json2、修改提案内容接下来可按需求修改两个提案文件（提案元消息和参数的新值以及存款数量等等），一般来说可以把元消息放到ipfs网络上去，修改的提案内容示例如下：{ "messages": [ { "@type": "/cosmos.gov.v1.MsgUpdateParams", "authority": "cosmos10d07y265gmmuvt4z0w9aw880jnsr700j6zn9kn", "params": { "min_deposit": [{"amount":"10000000","denom":"stake"}], "max_deposit_period": "172800s", "voting_period": "172800s", "quorum": "0.334", "threshold": "0.5", "veto_threshold": "0.334", "min_initial_deposit_ratio": "0", "burn_vote_quorum": false, "burn_proposal_deposit_prevote": false, "burn_vote_veto": true } } ], "metadata": "ipfs://CID", "deposit": "1000stake", "title": "a", "summary": "a" }提案中所有参数都需要填写，如果不需要更新某个值，可以填写旧值，chaind query gov params命令查看模块参数当前值3、发送提案交易使用刚才修改好的提案json文件发起提案chaind tx gov submit-proposal draft_proposal.json --from key0提案id可以通过交易哈希查到，也可以使用接口查询所有提案chaind query gov proposals4、存款押金给ID为1的提案的存入押金chaind tx gov deposit 1 10000000stake --from key05、投票给ID为1的提案的投赞成票（yes、no、no_with_veto、abstain）chaind tx gov vote 1 yes --from key06、查询查询ID为1的提案的信息chaind query gov proposal 1查询ID为1的提案的投票统计chaind query gov tally 1查询ID为1的提案的所有投票chaind query gov votes 1
运行基于cosmos sdk开发的区块链程序一、环境操作系统：linuxgo版本：1.20.4以上ignite版本：0.27.1以上二、约定开发区块链应用程序可以参考文档ignite为了方便运行go语言程序，需要将目录$HOME/go/bin/加入到环境变量PATH里面可以在项目根目录运行ignite chain build命令来生成二进制程序（通常放到目录$HOME/go/bin/）为了方便解说，可以为区块链程序统一起个别名，例如：alias chaind=gaiad程序可以使用-h选项来查看更多配置参数，为了简单尽量使用了默认参数一般来说基于cosmos sdk开发的区块链，如果项目名称为appname，那么默认的程序和工作目录分别是appnamed和$HOME/.appname，默认的链id为appname三、节点配置1、初始化chaind init [moniker]命令创建节点工作目录，moniker是自定义的节点名称，生成默认配置文件、基础创世文件和随机节点密钥，目录主要包括以下文件├── config │ ├── app.toml # 应用程序相关的配置文件 │ ├── config.toml # CometBFT相关配置文件 │ ├── genesis.json # 创世文件 │ ├── node_key.json # p2p协议中用于节点身份验证的私钥 │ └── priv_validator_key.json # 在共识协议中用作验证节点的私钥 └── data # 节点使用的数据存储目录--home string：自定义工作目录--chain-id string：自定义创世文件中的链id--staking-bond-denom string：自定义质押币名称2、账户chaind keys add [name]命令创建新的密钥，name是密钥名称，可以重复执行创建多个不同的账户--keyring-backend string：自定义密钥后端，参考文档keyring--keyring-dir string：自定义密钥文件存放目录3、创世账户chaind add-genesis-account [address_or_key_name] [coin][,[coin]] 命令添加账户到创世文件中，address_or_key_name是之前创建的密钥名称或任意账户地址，coin是资产（例如1000个质押币1000stake），可以重复执行配置多个创世账户4、创世交易chaind gentx [key_name] [amount]命令构造并签名创世交易，key_name是之前创建的密钥名称，amount只能是质押币（至少是1000000000stake），交易内容是质押账户一定数量质押币来成为创世验证者--pubkey string：自定义节点公钥（默认由工作目录中priv_validator_key文件确定）--node-id string：自定义节点id（默认由工作目录中node_key.json文件确定）5、创世文件chaind collect-gentxs命令将创世交易写入到创世文件中，所有验证者签署交易后，由其中一个收集齐全后执行生成最终的创世文件--gentx-dir string：自定义创世交易目录6、启动节点chaind start命令将启动区块链节点，如果在一台电脑上运行多个节点需要分配端口避免端口冲突--home string：自定义节点工作目录--p2p.laddr string：默认tcp://0.0.0.0:26656--rpc.laddr string：默认tcp://127.0.0.1:26657--grpc.address string：默认0.0.0.0:9090--grpc-web.address string：默认0.0.0.0:9091--rpc.pprof_laddr string：默认0.0.0.0:6060--p2p.persistent_peers：持久的对等节点（逗号分割，ID@host:port）--p2p.seeds：种子节点（逗号分割，ID@host:port）除了通过命令行设置参数，也能通过修改节点配置文件（工作目录中的config/config.toml文件），例如：# persistent_peers = "[validator_address]@[ip_address]:[port],..." persistent_peers = "58811401b7b84caebea3cf674577a879dc53fdb1@127.0.0.1:26656"7、查询chaind tendermint show-validator：节点公钥chaind tendermint show-node-id：节点idchaind keys list：账户列表chaind keys show [name_or_address [name_or_address...]]：显示指定账户信息四、节点实例如果运行过区块链程序，可能需要删除之前的数据（包括但不限于工作目录）1、单节点推荐使用默认的工作目录、密钥后端、链id、质押币名称和端口号使用一个验证者创世# 初始化工作目录 chaind init testnode # 创建账户 chaind keys add key0 # 添加账户到创世文件 chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os # 签名创世交易 chaind gentx key0 100000000stake # 打包创世交易到创世文件中 chaind collect-gentxs # 启动节点 chaind start加入已存在的区块链网络需要准备指定区块链的程序、创世文件和对等节点地址列表等等，参考gaia的官方文档chaind init testnode # 复制指定区块链网络的创世文件genesis.json到工作目录中 # 参考章节：https://hub.cosmos.network/main/hub-tutorials/join-mainnet.html#genesis-file # 修改配置文件（config/config.toml）添加对等节点（种子节点）或在命令行中指定 # 参考章节：https://hub.cosmos.network/main/hub-tutorials/join-mainnet.html#seeds-peers chaind start2、多节点多节点需要配置区块链节点的工作目录和端口以避免程序冲突，其中包括--home string：指定工作目录--p2p.laddr string：默认tcp://0.0.0.0:26656--rpc.laddr string：默认tcp://127.0.0.1:26657--grpc.address string：默认0.0.0.0:9090--grpc-web.address string：默认0.0.0.0:9091--rpc.pprof_laddr string：默认0.0.0.0:6060--address string：默认tcp://0.0.0.0:26658--api.address string：默认tcp://0.0.0.0:1317一个验证者节点和一个同步节点创世并启动验证者节点node0# 初始化工作目录node0 chaind init testnode --home node0 # 创建账户key0 chaind keys add key0 --home node0 # 添加账户key0到创世文件 chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os --home node0 # 签名创世交易 chaind gentx key0 100000000stake --home node0 # 打包创世交易到创世文件中 chaind collect-gentxs --home node0 # 启动节点node0 chaind start --home node0启动同步节点node1# 初始化工作目录node1 chaind init testnode --home node1 # 创建账户key1 chaind keys add key1 --home node1 # 复制node0的创世文件到node1的工作目录中 cp node0/config/genesis.json node1/config/genesis.json # 启动节点node1 chaind start --home node1 --p2p.seeds $(chaind tendermint show-node-id --home node0)@127.0.0.1:26656 --rpc.laddr tcp://127.0.0.1:26667 --p2p.laddr tcp://0.0.0.0:26666 --grpc.address 0.0.0.0:9000 --grpc-web.address 0.0.0.0:9001 --rpc.pprof_laddr 0.0.0.0:6070将同步节点变成验证者节点# 给key1账户转账 chaind tx bank send key0 $(chaind keys show key1 -a --home node1) 100000000000stake --home node0 # 质押key1账户的币将node1节点变为验证者 chaind tx staking create-validator --amount 1000000000stake --from key1 --pubkey $(chaind tendermint show-validator --home node1) --node-id $(chaind tendermint show-node-id --home node1) --commission-rate 0.1 --commission-max-rate 0.2 --commission-max-change-rate 0.01 --min-self-delegation 1 --home node1两个验证者节点创世chaind init testnode --home node0 chaind init testnode --home node1 chaind keys add key0 --home node0 chaind keys add key1 --home node1 chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os --home node0 chaind add-genesis-account key1 10000000000000000000000000000stake --keyring-backend os --home node0 chaind gentx key0 100000000stake --home node0 chaind gentx key1 100000000stake --home node0 --pubkey $(chaind tendermint show-validator --home node1) --node-id $(chaind tendermint show-node-id --home node1) chaind collect-gentxs --home node0 cp node0/config/genesis.json node1/config/genesis.json chaind start --home node0 chaind start --home node1 --p2p.seeds $(chaind tendermint show-node-id --home node0)@127.0.0.1:26656 --rpc.laddr tcp://127.0.0.1:26667 --p2p.laddr tcp://0.0.0.0:26666 --grpc.address 0.0.0.0:9000 --grpc-web.address 0.0.0.0:9001 --rpc.pprof_laddr 0.0.0.0:6070五、节点交互运行了一个节点之后，可以查询其中的数据或者发送签名交易，节点程序内置客户端功能，也可以使用其他方式与节点交互，可以参考文档cosmos sdk，一般通过--node参数指定节点地址（默认值：tcp://localhost:26656）# 节点状态查询 chaind status # 查询账户key0资产 chaind query bank balances $(chaind keys show key0 -a) # 从账户key0到账户key1转账 chaind tx bank send key0 $(chaind keys show key1 -a) 1000000000000stake # 账户key1委托给验证者账户key0 chaind tx staking delegate $(chaind keys show key0 --bech val -a) 100000000stake --from key1 # 查询账户key1的所有委托详情 chaind query staking delegations $(chaind keys show key1 -a) # 查询账户key1的所有委托奖励 chaind query distribution rewards $(chaind keys show key1 -a) # 领取账户key1的所有委托奖励（验证者是自委托） chaind tx distribution withdraw-all-rewards --from key1 # 查询所有验证者详情（包括入狱的） chaind query staking validators # 查询所有验证者详情（实际参与共识的） chaind query tendermint-validator-set # 账户key1自委托成为验证者（绑定节点node1） chaind tx staking create-validator --amount 1000000000stake --from key1 --pubkey $(chaind tendermint show-validator --home node1) --commission-rate 0.1 --commission-max-rate 0.2 --commission-max-change-rate 0.01 --min-self-delegation 1 # 把账户key1给验证者账户key0的委托取消 chaind tx staking unbond $(chaind keys show key0 --bech val -a) 100000000stake --from key1 # 把账户key1给验证者账户key1的自委托取消（可能会导致此验证者入狱） chaind tx staking unbond $(chaind keys show key1 --bech val -a) 100000000stake --from key1验证者入狱：保留验证者身份，但不参与共识流程，验证者身份无法撤销，但可以撤销验证者自质押的所有币，验证者有不良行为或质押币不够多时可能会入狱