为您推荐:
精华内容
最热下载
问答
  • on his own account和of his own accord不可混用,前者意为“为了自己的利益地,自己负责地”,后者意为“自愿地,自发地”;on account of,意为“因为”,现比较少用upon去替代on;account后可接宾语和表语,且在...

    on his own account和of his own accord不可混用,前者意为“为了自己的利益地,自己负责地”,后者意为“自愿地,自发地”;

    on account of,意为“因为”,现比较少用upon去替代on;

    account后可接宾语和表语,且在宾语后偶尔会加上to be,偶尔会加上as,但都不常用。 I account him wise.I account him a wise man.

    注意句子On no account(决不)should we neglect our work中用的是should we,不是we should。 n.(名词)

    account 作“账目”解时指的是财政上的收支记录,可用于法人,也可用于自然人; 作“账户”解时可指在银行等(金融)单位开立的用于存取款项的账户,也可指使用互联网收发电子邮件的账户。作“赊欠账”解时美式英语中常用charge account,英式英语中常用credit account。account还可作“账单,交易清单”解。用于比喻account还可作“客户,老主顾”解,通常指有固定购销关系,尤其是赊销协议的单位或个人。

    account还可表示“对事件、人物等的叙述、报告、描写”或“对思想、理论、过程等的(尤指对上级的)解释、说明”,可以是口头的,也可以是书面的。

    account引申可作“重要性,价值,评价,考虑”解,也可作“好处,用处,利益”“理由,缘故”解,是不可数名词。

    短语 give a...account of的意思是“清账”,作出“报告”或“说明”,在口语里,还可表示“作出…的表现”。

    为加强语气而把短语on no account(决不,绝对不)放在句首时,句子要倒装。

    account在英式英语和美式英语中有时用法不同:“他不是重要人物”在英式英语中说He is a person of no account,也可说He is of no account; 而在美式英语中则说He is a no account person. v.(动词)

    account的基本意思有二:一是“解释”“说明”,可指口头或书面地对某事的原因、用途等给予全面详尽地说明。二是“认为”,指对某人〔事,事物〕从总体上或概括地作出判断,多表示肯定。

    account作“解释”“说明”解时,是不及物动词,接介词for指根据逻辑、标准、模式等对已存在的事物作出解释或说明(原因); 接介词to表示“向某人解释”。

    account作“认为”解时,是及物动词,常接以“as+ n. ”或“to be+ adj. ”充当补足语的复合宾语, as和to be常省略。

    account作“认为”解时,可用于被动结构。

    展开全文
    weixin_36228865 2021-06-22 22:55:48
  • Solana中的stake account 用于 delegate tokens to validators,来赚取奖励。 stake account的创建和维护不同于传统的wallet address,wallet address又名system account。 system account仅支持收发SOL,而stake ...

    1. 引言

    在这里插入图片描述
    wallet account对应的曲线为ed25519:

    pub struct Keypair(ed25519_dalek::Keypair);
    
    # solana config get //其中Keypair Path: /xxxxx/.config/solana/id.json  则为默认存储solana-keygen new的私钥地址
    // 将https://www.sollet.io/# 中的私钥导出,存入Keypair Path: /xxxxx/.config/solana/id.json 中
    # solana-keygen pubkey //显示的地址与 https://www.sollet.io/# 中的地址一致。
    
    # solana address //显示的地址与 https://www.sollet.io/# 中的地址一致。
    
    # solana config set --url https://api.testnet.solana.com //配置连接测试网
    # solana airdrop 1 //获取1SOL 测试token
    # solana balance //获取token余额
    
    // 强制生成新的key
    # solana-keygen new --no-passphrase --force
    

    Bitcoin and Ethereum use Secp256k1, NEO uses secp256r1, Cardano and Solana Ed25519.

    In any case, the overall process goes like this:
    Private-key → ed25519-elliptic-curve-magic → toBase58 → Address

    An account is essentially a file with an address (pubkey) that lives on the Solana blockchain. If you need to store data on chain it gets stored in an account. Accounts live in the memory of the network of validators. An account must pay rent (see below) in order to persist on chain.

    Solana中的account分为:

    • wallet account
    • vote account
    • stake account
    • program account
    • nonce account
    • token account

    Solana中的stake account 用于 delegate tokens to validators,来赚取奖励。
    stake account的创建和维护不同于传统的wallet address,wallet address又名system account。

    system account仅支持收发SOL,而stake account支持delegate token所需的复杂操作。

    不同于以太坊和比特币,为了keep accounts alive,Solana中引入了称为rent的storage cost。
    这种定期收取租金的做法有效地迫使Validator不要乐观地将过期账户存储到冷库中,从而节省存储成本,这对账户所有者不利,并可能导致他们的交易比其他人拖延更长的时间。另一方面,这可以防止恶意用户创建大量垃圾帐户,加重验证程序的负担。

    当前主网和测试网的fixed rent fee为19.055441478439427 lamports per byte-epoch。一个epoch对应约2天。(1 lamport=10^{-9} SOL)
    Rent计算中会包含account metadata(address, owner, lamports等等)的size,因此,最小的account,其rent计算的大小为128bytes,对应一个epoch的租金为2439 lamports。
    而对于具有15000bytes的account,其每个epoch的租金为0.000288276SOL,2年的租金为0.10529088 SOL。

    2. stake account

    对于wallet address(又名system account),拥有该地址私钥的holder可控制该钱包。
    每个stake account都有唯一的地址,可通过命令行或network explorer工具来查看账户信息。但是,stake account可以没有对应的私钥,即使有关联的私钥,也没法控制该stake account。

    仅在 使用命令行方式创建stake account 时,才会有对应stake account address的keypair file,创建该keypair file的主要目的也仅仅是用于保证所创建的stake account address是新的且unique的。

    2.1 stake account authority

    特定类型的account可有一种或多种关联的signing authority。account authority用于对该账号控制的特定交易进行签名。
    而在其他区块链系统中,控制account address对应keypair的holder可控制该account的所有行为。Solana的设计有所不同,借助不同的authority来控制account的不同行为。

    每个stake account有2种不同的signing authority,用于控制基于该stake account的不同行为:

    • stake authority
    • withdraw authority

    其中,stake authority主要用于对以下操作进行签名:

    • delegating stake
    • deactivating the stake delegation
    • splitting the stake account, creating a new stake account with a portion of the funds in the first account
    • merging two stake accounts into one
    • setting a new stake authority

    withdraw authority主要用于对以下操作进行签名:

    • withdrawing un-delegated stake into a wallet address
    • setting a new withdraw authority
    • setting a new stake authority

    当stake account创建时,就已设置了stake authority和withdraw authority,后续跟根据需要修改,stake authority 和 withdraw authority可为相同的地址,也可为2个不同的地址。其中withdraw authority keypair对账号的控制权更强,因为它可用于:

    • 清算stake account中的tokens
    • 当stake authority keypair lost或compromised时,可借助withdraw authority keypair来reset the stake authority。

    因此,当管理stake account时,保护withdraw authority keypair至关重要。

    $ ./solana stake-account E238XEFHdVXP5svYwa46R3gutLS5uyvgk4DGaUsPqmeM
    Balance: 180064.987050082 SOL
    Rent Exempt Reserve: 0.00228288 SOL
    Delegated Stake: 180064.984767202 SOL
    Active Stake: 180064.984767202 SOL
    Delegated Vote Account Address: 13DmkMhdpmJJu7nU2ozAyPiKuopZbYShMHV3JAA7YVYC
    Stake Authority: CbGav5iwgvGhJt8fJgha2ekE5pPguAisYwtcU23sHaZP
    Withdraw Authority: CbGav5iwgvGhJt8fJgha2ekE5pPguAisYwtcU23sHaZP
    

    借助$ ./solana validators 可查看到当前Solana网络中所有Validators的identity和vote account。

    2.2 multiple delegations

    每个stake account一次仅允许delegate给一个validator。该stake account中的tokens要么全部delegated,要么全部un-delegated,要么在称为delegated或un-delegated的过程中。若要将你的token的一部分(而不是全部)delegate给a validator,或者同时delegate给多个validators,则必须创建多个stake accounts。

    可基于拥有token的wallet address来创建多个stake accounts,或者,创建一个大的stake account,然后借助stake authority来将该account切分为多个account,每个account的金额可自行设定。

    可对多个stake account分配相同的stake authority和withdraw authority。

    2.3 merging stake account

    2个具有相同stake authority和lockup的stake authority可merge为一个单独的stake account。满足以下条件时,可进行merge操作:

    • 2个deactivated stake account。
    • an inactive stake into an activating stake during its activation epoch。

    以下场景时,voter pubkey和vote credits应匹配:

    • two activated stakes
    • two activating accounts that share an activation epoch, during the activation epoch

    除以上条件和场景之外的其他情况,merge操作都将失败。

    2.4 delegation warmup and cooldown

    当a stake account is delegated 或 a delegation is deactivated,该操作都不会立刻生效。

    delegation和deactivation将需要几个epochs来完成。

    同时,在单个epoch中,可delegated或deactivated的总stake也有限制,以防止网络中总体stake发生大幅突变。由于warmup和cooldown取决于网络中其他参与者的行为,具体的生效周期将很难预测。

    详细的warmup和cooldown timing规则可参看:https://docs.solana.com/cluster/stake-delegation-and-rewards#stake-warmup-cooldown-withdrawal

    2.5 lockup

    stake accounts有lockup,用于防止其拥有的tokens在特定的日期或epoch之前被withdraw。
    当lockup时,stake account仍然可以:

    • be delegated
    • un-delegated
    • split
    • 正常变更其stake authority和withdraw authority。

    但是,不支持对其进行withdraw into a wallet address操作。

    A lockup can only be added when a stake account is first created, but it can be modified later, by the lockup authority or custodian, the address of which is also set when the account is created.

    2.6 destroy a stake account

    与Solana中的其他类型的account类似,balance为0 SOL的stake account将不再track。当一个stake account未delegated,且其拥有的所有token都被withdraw to a wallet address时,该account address将被destroyed,未来将需要手工re-created for the address to be used again。

    3. vote account

    在Solana中,若想成为Validator,则需要创建vote account。可通过solana-create-vote-account 来创建vote account。
    除vote account address本身外,vote account的其他方面均可修改:

    • 可使用solana-vote-update-validator 来修改validator identity。
    • 可使用solana-vote-authorize-voter 来修改vote authority。
    • 可使用solana--vote-authorize-withdrawer 来修改withdraw authority。
    • 可使用solana-vote-update-commission 来修改commission。

    3.1 vote account address

    vote account address 的创建方式有2种:

    • 来源于a keypair file的public key
    • 根据a keypair file的public key和a seed string 派生出来的address

    vote account address不需要对任何交易进行签名,仅用于look up the account information。

    当某人需要delegate tokens in a stake account时,在该delegation command中需指定the vote account address of the validator to whom the token-holder wants to delegate。

    3.2 validator identity account

    validator identity为system account,用于 pay for all the vote transaction fees submitted to the vote account。

    由于validator is expected to vote on most valid blocks it receives, validator identity is frequently (可能每秒多次) signing transactions and paying fees。因此,需要validator identity keypair需要以热钱包(keypair file)的方式存储于validator进程所运行的系统上。

    通常,热钱包的安全性要低于离线或冷钱包,validator operator应在identity account中选择存储小额够一定期限内(数周或数月)用于投票的费用。这将有助于控制因节点硬盘或文件系统故障等导致的资金丢失风险。
    validator的identity account应定期topped off from a more secure wallet。

    当vote account创建时,需提供validator identity。

    3.3 vote authority

    vote authority keypair用于sign each vote transaction the validator node wants to submit to the cluster。
    vote authority没必要与validator identity不同。因为vote authority和identity account雷士,均需要频繁的对交易签名,因此,没必要在validator进程所在的文件系统中再保存一个hot keypair。

    vote authority可设置为与validator identity account一样。当两者一样时,在每个vote transaction中仅需要一个签名,来sign the vote and pay the transaction fee。由于Solana中的transaction fee是根据签名个数来评估的,使用一个签名相比于使用2个不同的账号进行2次签名,交易费用可节约一半。

    可在vote account创建时设置vote authority,若未明确指出,其默认为与validator identity一样。可通过solana-vote-authorize-voter 来修改。
    不过,vote authority在每个epoch最多可修改一次,且在下个epoch才生效。为了平滑的在epoch边界过度vote signing,可在solana-validator中附带–authorized-voter参数来明确指定。

    3.4 vote account 的withdraw authority

    withdraw authority keypair通过solana-withdraw-from-vote-account命令来withdraw funds from a vote account。validator获得的任何网络激励都将存入vote account中,且仅可通过withdraw authority keypair签名来获取。

    需要使用withdraw authority keypair来对以下交易进行签名:

    • any transaction to change a vote account’s commission
    • any transaction to change the validator identity on a vote account

    由于vote account的balance会增加,因此需要将withdraw authority keypair以离线或冷钱包的方式保存,因为其并不需要频繁的对交易进行签名。

    可使用solana--vote-authorize-withdrawer 命令来修改withdraw authority。

    3.5 vote account commission

    commission为:the percent of network rewards earned by a validator that are deposited into the validator’s vote account。剩余的rewards将分发给all of the stake accounts delegated to that vote account, proportional to the active stake weight of each stake account。

    如,若a vote account的commission为10%,则all rewards earned by that validator in a given epoch的10%将在下一个epoch的第一个block中直接存入到the vote account,而剩下的90%将直接作为active stake存入各delegated stake accounts。

    为了吸引更多的stake delegations,validator可设置更低的commission值。由于运行和维护validator节点需要一定的成本,应设置一个合理高的commission值来覆盖其运维成本。

    可在创建vote account时附加–commission来在设置commission值,若未明确指定,该值默认为100%,即所有奖励直接存入vote account,而没有奖励会分发给delegated stake accounts中。

    可通过solana-vote-update-commission 来修改commission,该值取值范围为0~100,--commision 10 表示为10% commission。

    3.6 vote account authority key rotation

    对于live validator,rotating the vote account authority keys需要以下特殊操作,详细参见:https://docs.solana.com/running-validator/vote-accounts#key-rotation

    4. program account

    在Solana中,智能合约统称为program。每个链上program其本质就是个account,只是其标记为“Executable: true”,意味着它是an executable file。program一旦部署在链上,就可read并通过instructions来交互。

    • program id:为program的public key。
    • account ownership:accounts are owned by programs which are indicated by a program id in the metadata “owner” field。

    native program,为网络中必须运行的特殊program,主要有:【详细参见:Solana native programs

    • system program:负责创建新的accounts,以及分配account ownership。
    • BPF Loader:负责Solana合约的部署、升级以及instructions运行。
    • 以及其他与solana programming关联的其他native programs。

    token program:为实现不同于native SOL token的 fungible或non-fungible token的program。

    associated token accounts:若an account holds any token other than the native Solana token, it will have an associated token account for each type of token it holds。

    instruction:what is called in order to execute a function of a program。

    Sysvar:为an account which enforces certain variables of the network such as epoch, rent, validator rewards, etc…

    Program Derived Addresses (PDAs):PDAs enable the transfer of an account’s ownership from one program to another. This is useful for situations that require an escrow account such as auctions, DEXs, swaps, etc…

    Cross Program Invocation:Calling a program from another program. This is helpful for more complex on chain actions. Such as executing an instruction of an associated token account program during a token swap。

    5. nonce account

    为了防止replay,Solana交易中包含了一个nonce field,里面存储了a recent blockhash value。交易中包含的blockhash若为2分钟前的,则判定为too old,将被网络拒绝入链。
    但是对于一些custodial service,其需要更长的事件来为交易签名,因此,需要设计一种机制来满足线下参与者。

    新增的nonce field需满足以下要求:

    • 1)交易签名必须包含该nonce value。
    • 2)该nonce必须为不可reusable,其实在signing key公开的情况下,nonce也应不可reusable。

    基于contract的解决方案为:
    client可在交易的recent_blockhash field 中 “stash” a nonce value for future use,这类似于the Compare and Swap atomic instruction,implemented by some CPU ISAs。

    当使用durable nonce时,client必须首先从account data中查询该值。交易的构建过程中需额外引入:

    • 1)the durable nonce value is used in the recent_blockhash field
    • 2)an AdvanceNonceAccount instruction is the first issued in the transaction

    详细的合约机制为:

    Start
    Create Account
      state = Uninitialized
    NonceInstruction
      if state == Uninitialized
        if account.balance < rent_exempt
          error InsufficientFunds
        state = Initialized
      elif state != Initialized
        error BadState
      if sysvar.recent_blockhashes.is_empty()
        error EmptyRecentBlockhashes
      if !sysvar.recent_blockhashes.contains(stored_nonce)
        error NotReady
      stored_hash = sysvar.recent_blockhashes[0]
      success
    WithdrawInstruction(to, lamports)
      if state == Uninitialized
        if !signers.contains(owner)
          error MissingRequiredSignatures
      elif state == Initialized
        if !sysvar.recent_blockhashes.contains(stored_nonce)
          error NotReady
        if lamports != account.balance && lamports + rent_exempt > account.balance
          error InsufficientFunds
      account.balance -= lamports
      to.balance += lamports
      success
    

    希望使用该feature的client需在system program下创建一个nonce account。该account将在Uninitialized state with no stored hash, and thus unusable。

    为了初始化新创建的nonce account,需借助InitializeNonceAccount指令。该指令的输入参数为:the Pubkey of the account’s authority。

    nonce account必须为rent-exempt的,以满足该feature的data-persistence要求,因此,需确保在初始化时存入足够的lamports。初始化成功后,the cluster’s most recent blockhash is stored along with specified nonce authority Pubkey

    AdvanceNonceAccount指令用于管理nonce account的stored nonce value。其存储了the cluster’s most recent blockhash in the account’s state data, failing if that matches the value already stored there。这种check可防止同一区块内的replay交易。

    由于nonce account必须是rent-exempt的,因此,需要用一个custom withdraw指令来从该nonce account中移出资金。WithdrawNonceAccount指令的输入参数只有一个,即the lamports to withdraw,同时enforces rent-exemption by preventing the account’s balance from falling below the rent-exempt minimum。An exception to this check is if the final balance would be zero lamports, which makes the account eligible for deletion. This account closure detail has an additional requirement that the stored nonce value must not match the cluster’s most recent blockhash, as per AdvanceNonceAccount.

    nonce account的nonce authority可使用AuthorizeNonceAccount指令来修改,输入参数只有一个:the Pubkey of the new authority。执行该指令将grants full control over the account and its balance to the new authority。

    AdvanceNonceAccount, WithdrawNonceAccount and AuthorizeNonceAccount all require the current nonce authority for the account to sign the transaction.

    具体的nonce account Runtime Support见:https://docs.solana.com/implemented-proposals/durable-tx-nonces#runtime-support

    5.1 nonce authority

    nonce account的authority可optionally be assigned to another account。若更换新的authority,则将接管之前authority的所有权限,包括the account creator。该feature有助于创建更复杂的account ownership arrangements,以及派生account addresses not associated with a keypair。

    以下指令均支持--nonce-authority <AUTHORITY_KEYPAIR>参数:

    • create-nonce-account
    • new-nonce
    • withdraw-from-nonce-account
    • authorize-nonce-account

    5.2 nonce account创建

    Durable transaction nonce是为了解决交易中recent_blockhash lifetime较短问题,便于线下参与者参与签名等操作。

    为了保证keypair完全线下,可采用纸钱包指令替换:

    solana-keygen new -o nonce-keypair.json
    solana create-nonce-account nonce-keypair.json 1
    

    查询the stored nonce value:

    solana nonce nonce-keypair.json
    

    更新nonce值:

    solana new-nonce nonce-keypair.json
    

    显示nonce account:

    solana nonce-account nonce-keypair.json
    

    从nonce account中提取资金:

    solana withdraw-from-nonce-account nonce-keypair.json ~/.config/solana/id.json 0.5
    

    为nonce account分配新的authority:

    solana authorize-nonce-account nonce-keypair.json nonce-authority.json
    

    5.3 nonce account应用举例

    假设Alice想使用durable nonce来给Bob支付0.01SOL:
    1)创建账号:

    $ solana-keygen new -o alice.json
    $ solana-keygen new -o nonce.json
    $ solana-keygen new -o bob.json
    

    2)给Alice充钱:

    $ solana airdrop -k alice.json 1
    1 SOL
    

    3)为Alice创建nonce account:

    $ solana create-nonce-account -k alice.json nonce.json 0.1
    3KPZr96BTsL3hqera9up82KAU462Gz31xjqJ6eHUAjF935Yf8i1kmfEbo6SVbNaACKE5z6gySrNjVRvmS8DcPuwV
    

    4)模拟签名时间很长的转账交易——转账失败:

    $ solana pay -k alice.json --blockhash expiredDTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7 bob.json 0.01
    [2020-01-02T18:48:28.462911000Z ERROR solana_cli::cli] Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })
    Error: Io(Custom { kind: Other, error: "Transaction \"33gQQaoPc9jWePMvDAeyJpcnSPiGUAdtVg8zREWv4GiKjkcGNufgpcbFyRKRrA25NkgjZySEeKue5rawyeH5TzsV\" failed: None" })
    

    5)借助Alice的nonce中存储的blockhash可成功转账:

    $ solana nonce-account nonce.json
    balance: 0.1 SOL
    minimum balance required: 0.00136416 SOL
    nonce: F7vmkY3DTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7
    
    $ solana pay -k alice.json --blockhash F7vmkY3DTaxfagttWjQweib42b6ZHADSx94Tw8gHx3W7 --nonce nonce.json bob.json 0.01
    HR1368UKHVZyenmH7yVz5sBAijV6XAPeWbEiXEGVYQorRMcoijeNAbzZqEZiH8cDB8tk65ckqeegFjK8dHwNFgQ
    

    6)验证转账结果和nonce account值更新:

    $ solana balance -k bob.json
    0.01 SOL
    
    $ solana nonce-account nonce.json
    balance: 0.1 SOL
    minimum balance required: 0.00136416 SOL
    nonce: 6bjroqDcZgTv6Vavhqf81oBHTv3aMnX19UTB51YhAZnN
    

    6. token account

    通过$spl-token create-account TOKENADDRESS创建的即为token account。
    Before the user can receive tokens, their associated token account must be created on-chain, requiring a small amount of SOL to mark the account as rent-exempt.

    $ spl-token create-account 2ceBgDjUmYRMi2nWgU4WyknrSjYEZircNjxuK5BzSnda
    Creating account B5siXgxo3GcmkvHJwfqtTpyZcT4ZPuDWaYE4RrDab6qX
    
    Signature: 5akVkmWVjFCzaTrVr9uk2dMYdAzPBVQiCufF61oagKLCUY59ZYFwmr6VAei7KshbAabRQy12iMaqy1GhcWJaD84G
    
    $ solana balance B5siXgxo3GcmkvHJwfqtTpyZcT4ZPuDWaYE4RrDab6qX
    0.00203928 SOL
    

    There’s no restriction on who can create a user’s associated token account. It could either be created by the wallet on behalf of the user or funded by a 3rd party through an airdrop campaign.

    可即时清理关闭账号,从而实现对账号中余额的回收,详细见:https://spl.solana.com/token#closing-accounts

    根据Associated Token Account Program
    对于相同的mint,一个用户可能对应有任意多个token account,这使得其他用户很难知道which account they should send tokens to and introduces friction into many other asepcts of token management。
    为此,需引入deterministically 方法来derive a token account key from a user’s main System account address and a token mint address,使得用户可创建a main token account for each token he owns。将这些account 称为 Associated Token Accounts。

    此外,还支持用户给另一没有该mint token account的用户发送token。与system transfer不同,for a token transfer to succeed the recipient must have a token account with the compatible mint already, and somebody needs to fund that token account. If the recipient must fund it first, it makes things like airdrop compaigns difficult and just generally increases the friction of token transfers. AToken 允许发送者来创建 接收者的associated token account,使得token transfer可正常运行。

    The associated token account for a given wallet address is simply na program-derived account consisting of the wallet address itself and the token mint.
    客户端可调用create_associated_token_address Rust函数来派生wallet’s associated token account。所创建的associated token account仍然完全由钱包控制,与钱包自己创建的效果是一样的。

    参考资料

    [1] Solana Stake Account Structure
    [2] Solana Delegate Stake
    [3] Solana Development Tutorial: Program 101
    [4] Solana Development Tutorial: Environment setup
    [5] [How to] create a Solana Address & delegate your SOL tokens using the Terminal (CLI) on your Mac
    [6] Solana Vanity Address using GPUs
    [7] Solana Clusters
    [8] Vote account management
    [9] Solana Programming Concepts
    [10] Durable Transaction Nonces
    [11] Durable Transaction Nonces Proposal

    展开全文
    mutourend 2021-08-12 11:46:46
  • 创建serviceaccount2. 创建UserAccount三.Authorization(授权)1.role示例2.ClusterRole示例四.服务账户的自动化 一.访问控制原理 Authentication(认证) 认证方式现共有8种,可以启用一种或多种认证方式,只要...

    一.访问控制原理

    请添加图片描述

    请添加图片描述

    Authentication(认证)

    认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。

    Kubernetes集群有两类用户:由Kubernetes管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。

    Authorization(授权)

    必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC。

    Admission Control(准入控制)

    用于拦截请求的一种方式,运行在认证、授权之后,是权限认证链上的最后一环,对请求API资源对象进行修改和校验

    访问k8s的API Server的客户端主要分为两类:

    1. kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。

    2. pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。

    kubectl向apiserver发起的命令,采用的是http方式,其实就是对URL发起增删改查的操作。

    kubectl  proxy --port=8888 &
    
    netstat -antlp | grep :8888
    
    curl http://localhost:8888/api/v1/namespaces/default
    curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments
    

    请添加图片描述

    请添加图片描述

    请添加图片描述

    以上两种api的区别是:

    api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
    apis 它是一般API访问的入口固定格式名。
    

    二.Authentication(认证)

    UserAccount与serviceaccount:

    用户账户是针对人而言的。 服务账户是针对运行在 pod 中的进程而言的。

    用户账户是全局性的。 其名称在集群各 namespace 中都是全局唯一的,未来的用户资源不会做 namespace 隔离, 服务账户是 namespace 隔离的。

    通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。 服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 ( 即权限最小化原则 )。

    1.创建serviceaccount

    创建serviceaccount

    kubectl get sa
    kubectl create sa admin	##创建serviceaccount
    kubectl get sa
    
    

    请添加图片描述

    我们可以查看创建的admin的yaml文件信息:

    kubectl get sa admin -o yaml
    

    请添加图片描述

    查看admin的信息:
    我们可以看到此时k8s为用户自动生成认证信息,但没有授权!!

    kubectl describe sa admin 
    

    请添加图片描述
    添加secrets到serviceaccount中:

    kubectl patch serviceaccount admin -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
    
    kubectl describe sa admin 
    

    请添加图片描述

    把serviceaccount和pod绑定起来,拉取私密仓库创建nginx pod:
    添加认证信息
    前面写过一个清单可以用到:

    cd 
    cd configmap
    vim registry.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
        name: mypod
    spec:
      containers:
        - name: game2048
          image: reg.westos.org/westos/game2048
      serviceAccountName: admin ##添加认证信息
    

    请添加图片描述

    执行它,并查看pod节点:

    kubectl apply -f registry.yaml
    
    kubectl get pod
    

    请添加图片描述
    查看mypod信息:

    kubectl describe pod mypod
    

    请添加图片描述
    将认证信息添加到serviceAccount中,要比直接在Pod指定imagePullSecrets要安全很多

    2. 创建UserAccount

    openssl和openssh的区别:一个是协议,一个是服务,openssh是远程连接的加密服务,openssl是协议,整个ca都是通过openssl建立的

    生成key,通过这个key生成证书请求,通过证书请求生成相应的证书:test.crt
    ,查看证书信息:

    cd /etc/kubernetes/pki/
    ls
    openssl genrsa -out test.key 2048	##生成key
    openssl req -new -key test.key -out test.csr -subj "/CN=test"	##通过这个key生成证书请求
    openssl  x509 -req -in test.csr -CA ca.crt -CAkey ca.key  -CAcreateserial -out test.crt -days 365	##通过证书请求生成相应的证书:test.crt
    openssl x509 -in test.crt -text -noout	##查看证书信息
    
    

    请添加图片描述

    请添加图片描述

    请添加图片描述

    把生成的证书和key放到集群中,让我们的集群可以识别到,生成用户test,证书和key与test用户做了个绑定

    kubectl config set-credentials test --client-certificate=/etc/kubernetes/pki/test.crt --client-key=/etc/kubernetes/pki/test.key --embed-certs=true	
    
    kubectl  config view	##显示查看
    

    请添加图片描述

    请添加图片描述

    针对test用户设置信息来应用k8s集群;
    使用context,切换成了test.

    kubectl config set-context test@kubernetes --cluster=kubernetes --user=test
    
    kubectl config use-context test@kubernetes
    
    kubectl  config view	##显示查看
    

    请添加图片描述

    请添加图片描述我们可以看到集群的使用者变为test!!

    请添加图片描述

    但是此时的用户通过认证,但还没有权限操作集群资源,需要继续添加授权

    kubectl get pod
    

    请添加图片描述

    三.Authorization(授权)

    RBAC(Role Based Access Control):基于角色访问控制授权。

    允许管理员通过Kubernetes API动态配置授权策略。RBAC就是用户通过角色与权限进行关联。
    RBAC只有授权,没有拒绝授权,所以只需要定义允许该用户做什么即可。
    RBAC的四种类型:Role、ClusterRole、RoleBinding、ClusterRoleBindin

    请添加图片描述

    RBAC的三个基本概念:

    Subject:被作用者,它表示k8s中的三类主体, user, group, serviceAccount
    Role:角色,它其实是一组规则,定义了一组对 Kubernetes API 对象的操作权限。
    RoleBinding:定义了“被作用者”和“角色”的绑定关系。

    Role 和 ClusterRole

    Role是一系列的权限的集合,Role只能授予单个namespace 中资源的访问权限。
    ClusterRole 跟 Role 类似,但是可以在集群中全局使用。

    RoleBinding和ClusterRoleBinding

    RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role。
    RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

    1.role示例

    创建Role(权限的集合)

    mkdir roles
    cd roles/
    ls
    vim role.yaml
    
    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: default
      name: myrole
    rules:
    - apiGroups: [""] 
      resources: ["pods"]
      verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]
    

    请添加图片描述

    执行清单,并查看角色:

    kubectl apply -f role.yaml
    kubectl get role
    kubectl describe mutating**********
    kubectl describe role myrole
    

    请添加图片描述

    RoleBinding和ClusterRoleBinding
    RoleBinding是将Role中定义的权限授予给用户或用户组。它包含一个subjects列表(users,groups ,service accounts),并引用该Role。
    RoleBinding是对某个namespace 内授权,ClusterRoleBinding适用在集群范围内使用。

    创建RoleBinding文件:

    vim rolebinging.yml 
    
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: test-read-pods
      namespace: default
    subjects:
    - kind: User
      name: test
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: myrole
      apiGroup: rbac.authorization.k8s.io
    

    请添加图片描述

    执行rolebinging.yml 文件并查看角色:

    Kubectl apply -f rolebindingyaml
    kubectl get role
    kubectl get rolebindings.rbac.authorization.k8s.io
    
    

    请添加图片描述
    再次使用context,切换成了test.
    查看pod节点可以查看到了!
    但是查看其他的namespace就不能成功!

    kubectl config use-context test@kuberbetes
    kubectl get pod
    kubectl get pod -n kube-system
    

    请添加图片描述

    2.ClusterRole示例

    vim clusterrole.yml  
    
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: myclusterrole
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list", "delete", "create", "update"]
    - apiGroups: ["extensions", "apps"]
      resources: ["deployments"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    
    

    请添加图片描述

    使用context,切换成了admin,执行清单:
    不切换执行清单就会报错

    kubectl config use-context kubernetes-admin@kubernetes
    
    kubectl apply -f cluserrole.yaml
    

    请添加图片描述
    查看到clusterrole

    kubectl get clusterrole | grep mycluster
    

    请添加图片描述

    使用rolebinding绑定clusterRole
    在rolebinding.yml 文件后面直接添加绑定clusterRole的清单:

    vim rolebinding.yml 
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: rolebind-myclusterrole
      namespace:  default
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: myclusterrole
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: test
    

    请添加图片描述

    执行清单 rolebinding.yml
    使用context,切换成了test!!!

    kubectl apply -f rolebinding.yaml
    kubectl get deployments.apps
    

    我们可以看到deployments.apps已经可以查看了,只不过没有deployments而以!
    请添加图片描述

    将之前写的 deployments清单执行:

    cd
    cd ingress/
    kubectl apply -f deployment-nginx.yaml
    
    

    请添加图片描述再次查看deployments.apps就可以查看到信息了,pod节点也生成了!!但是svc的信息还是没有权限访问,所以我们待会需要将svc也添加进去!

    kubectl get deployments.apps
    kubectl get pod
    kubectl get svc
    

    请添加图片描述

    我们将svc的权限也写进去:
    clusterrole.yml 后面直接添加即可!

    vim clusterrole.yml 
    
    - apiGroups: [""]
      resources: ["services","endpoints"]
      verbs: ["get", "watch", "list", "delete", "create", "update"]
    
    

    请添加图片描述
    使用context,切换成了admin,执行清单:

    kubectl config use-context kubernetes-admin@kubernetes
    
    kubectl apply -f cluserrole.yaml
    

    请添加图片描述

    使用context,切换成了test,再次查看svc

    kubectl config use-context test@kubernetes
    kubectl get svc
    kubectl descirbe svc nginx-svc
    

    请添加图片描述

    请添加图片描述

    但是查看svc在其他namespace:kube-system
    的信息还是没有权限:

    kubectl get svc -n kube-system
    

    请添加图片描述

    在rolebinding.yml 文件中,修改kind:ClusterRoleBinding
    如下图所示:

    vim clusterrolebinding.yml 
    kind: CluserRoleBinding
    

    请添加图片描述
    执行清单:
    这次就可以查看到其他namespace的pod节点信息!!

    kubectl apply -f clusterrolebinding.yml 
    
    kubectl config use-context test@kubernetes
    kubectl get pod -n ingress-nginx
    kubectl get pod -n kube-system
    
    

    请添加图片描述

    请添加图片描述

    请添加图片描述

    四.服务账户的自动化

    服务账户准入控制器(Service account admission controller)

    如果该 pod 没有 ServiceAccount 设置,将其 ServiceAccount 设为 default。
    保证 pod 所关联的 ServiceAccount 存在,否则拒绝该 pod。
    如果 pod 不包含 ImagePullSecrets 设置,那么 将 ServiceAccount 中的 ImagePullSecrets 信息添加到 pod 中。
    将一个包含用于 API 访问的 token 的 volume 添加到 pod 中。
    将挂载于 /var/run/secrets/kubernetes.io/serviceaccount 的 volumeSource 添加到 pod 下的每个容器中。

    Token 控制器(Token controller)

    检测服务账户的创建,并且创建相应的 Secret 以支持 API 访问。
    检测服务账户的删除,并且删除所有相应的服务账户 Token Secret。
    检测 Secret 的增加,保证相应的服务账户存在,如有需要,为 Secret 增加 token。
    检测 Secret 的删除,如有需要,从相应的服务账户中移除引用。

    服务账户控制器(Service account controller)

    服务账户管理器管理各命名空间下的服务账户,并且保证每个活跃的命名空间下存在一个名为 “default” 的服务账户


    Kubernetes 还拥有“用户组”(Group)的概念:

    ServiceAccount对应内置“用户”的名字是:

    system:serviceaccount:<ServiceAccount名字 >
    

    而用户组所对应的内置名字是:

    system:serviceaccounts:<Namespace名字 >
    

    示例1:表示mynamespace中的所有ServiceAccount
    subjects:

    - kind: Group
      name: system:serviceaccounts:mynamespace
      apiGroup: rbac.authorization.k8s.io
    

    示例2:表示整个系统中的所有ServiceAccount

    subjects:
    - kind: Group
      name: system:serviceaccounts
      apiGroup: rbac.authorization.k8s.io
    

    Kubernetes 还提供了四个预先定义好的 ClusterRole 来供用户直接使用:

    cluster-amdin
    admin
    edit
    view
    

    示例:(最佳实践)

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: readonly-default
    subjects:
    - kind: ServiceAccount
      name: default
      namespace: default
    roleRef:
      kind: ClusterRole
      name: view
      apiGroup: rbac.authorization.k8s.io
    
    展开全文
    qq_46490950 2021-08-03 19:49:13
  • mysql>DESCzbphp.com_account_log;+--------------+-----------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+--...

    mysql> DESC zbphp.com_account_log;

    +--------------+-----------------------+------+-----+---------+----------------+

    | Field        | Type                  | Null | Key | Default | Extra          |

    +--------------+-----------------------+------+-----+---------+----------------+

    | log_id       | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |

    | user_id      | mediumint(8) unsigned | NO   | MUL | NULL    |                |

    | user_money   | decimal(10,2)         | NO   |     | NULL    |                |

    | frozen_money | decimal(10,2)         | NO   |     | NULL    |                |

    | rank_points  | mediumint(9)          | NO   |     | NULL    |                |

    | pay_points   | mediumint(9)          | NO   |     | NULL    |                |

    | change_time  | int(10) unsigned      | NO   |     | NULL    |                |

    | change_desc  | varchar(255)          | NO   |     | NULL    |                |

    | change_type  | tinyint(3) unsigned   | NO   |     | NULL    |                |

    +--------------+-----------------------+------+-----+---------+----------------+

    9 rows in set (0.02 sec)

    mysql>

    mysql> DESC zbphp.com_pay_log;

    +--------------+------------------------+------+-----+---------+----------------+

    | Field        | Type                   | Null | Key | Default | Extra|

    +--------------+------------------------+------+-----+---------+----------------+

    | log_id       | int(10) unsigned       | NO   | PRI | NULL    | auto_increment|

    | order_id     | mediumint(8) unsigned  | NO   |     | 0       ||

    | order_amount | decimal(10,2) unsigned | NO   |     | NULL    ||

    | order_type   | tinyint(1) unsigned    | NO   |     | 0       ||

    | is_paid      | tinyint(1) unsigned    | NO   |     | 0       ||

    +--------------+------------------------+------+-----+---------+----------------+

    5 rows in set (0.00 sec)

    mysql> DESC zbphp.com_user_account;

    +--------------+-----------------------+------+-----+---------+----------------+

    | Field        | Type                  | Null | Key | Default | Extra          |

    +--------------+-----------------------+------+-----+---------+----------------+

    | id           | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |

    | user_id      | mediumint(8) unsigned | NO   | MUL | 0       |                |

    | admin_user   | varchar(255)          | NO   |     | NULL    |                |

    | amount       | decimal(10,2)         | NO   |     | NULL    |                |

    | add_time     | int(10)               | NO   |     | 0       |                |

    | paid_time    | int(10)               | NO   |     | 0       |                |

    | admin_note   | varchar(255)          | NO   |     | NULL    |                |

    | user_note    | varchar(255)          | NO   |     | NULL    |                |

    | process_type | tinyint(1)            | NO   |     | 0       |                |

    | payment      | varchar(90)           | NO   |     | NULL    |                |

    | is_paid      | tinyint(1)            | NO   | MUL | 0       |                |

    | trade_no     | varchar(32)           | NO   | MUL | NULL    |                |

    | trade_status | varchar(32)           | NO   | MUL | NULL    |                |

    | ip           | varchar(15)           | NO   |     | NULL    |                |

    | ippoz        | varchar(30)           | NO   |     | NULL    |                |

    +--------------+-----------------------+------+-----+---------+----------------+

    15 rows in set (0.00 sec)

    数据库中涉及充值的三个表: account_log,pay_log,user_account

    account_log -- 存放用户充值/提现响应记录  变更记录

    涉及的操作函数:

    1) log_account_change()  更改会员信息

    2) get_user_surplus()查询会员余额总数

    pay_log  -- 存放支付记录 包括充值 付款 提款

    1)insert_pay_log() 插入付款记录

    2)get_paylog_id() 获得付款信息的记录

    user_account --  会员充值/提现申请记录

    涉及的函数:

    1)insert_user_account() 插入记录

    2)update_user_account() 更新账目明细

    3)get_surplus_info() 获得

    4)get_account_log() 获得,更详尽

    5)del_user_account() 删除

    其他字段

    users.user_money

    users.frozen_money

    展开全文
    weixin_39979215 2021-01-27 23:32:40
  • k663514387 2021-06-14 18:04:26
  • weixin_29232121 2021-05-07 06:24:13
  • weixin_43394724 2021-10-11 13:07:19
  • lihongbao80 2021-09-07 16:22:43
  • yibai_ 2021-04-06 17:55:10
  • weixin_37337210 2021-01-17 20:47:18
  • weixin_30855927 2021-03-17 21:21:04
  • weixin_39593744 2021-03-08 23:21:00
  • alongsun 2021-12-09 15:15:08
  • davidullua 2021-12-17 17:39:48
  • a420344 2021-10-19 16:20:13
  • weixin_39638801 2021-01-27 11:42:36
  • qwejiaji 2021-08-05 10:32:13
  • weixin_33595018 2021-05-02 09:11:44
  • weixin_39964590 2021-03-07 21:51:03
  • qq_45618521 2021-06-20 22:03:10
  • weixin_33585822 2021-03-07 21:51:47
  • tianmingqing0806 2021-11-29 19:38:39
  • qq_34556414 2021-04-12 10:26:39
  • u013488094 2021-03-10 14:21:05
  • hpdlzu80100 2021-09-28 10:56:48
  • m0_46695871 2021-06-02 20:46:28
  • weixin_39811101 2021-01-12 22:34:16
  • lf2283088160 2021-10-13 11:36:17
  • qq_53101120 2021-04-03 15:48:55
  • weixin_43507738 2021-05-13 16:27:28

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 507,303
精华内容 202,921
关键字:

account