{"author":{"address":"0xD736da8B41457F7b5E962c889aa728AB178D60aa","user":"https://learnblockchain.cn/people/22219"},"content":{"body":"## 今天学习内容\r\n\r\ndecert.me 上面的 [solana 课程](https://decert.me/tutorial/sol-dev/)\r\n\r\n因为之前已经学了一点点 rust 和 solana 了，今天感觉比较轻松。\r\n\r\n入门了 `@solana/web3.js` 的使用，包括\r\n\r\n- 配置不同的 devnet rpc，我用的是 quicknode，感觉比 ankr 好，solana.com 因为网络限制原因，访问不了\r\n- `solana airdrop` 领了 devnet 的测试币，以及体验了 `solana transfer`\r\n- 同样的，使用 js 包完成了余额查询和转账。\r\n\r\n今天遇到的问题是对钱包的连接和使用不熟悉，还在探索阶段。\r\n\r\n这几天的目标是把教程的电影 dapp 完成。\r\n\r\n## 关于 solana 账户模型的理解\r\n\r\nsolana 中一切皆账户\r\n- 用户钱包\r\n- 智能合约（程序）\r\n- 和智能合约交易的数据\r\n\r\nsolana 怎么支持并发：solana 上的智能合约（程序）都是无状态的，数据存储在单独的账户中，需要执行的时候通过声明只读和可写，如果是只读的数据，完全可以并发执行而无需考虑写导致的问题。\r\n\r\n数据存储在单独的账户中，需要保证账户除了合约外不受其他控制，所以有 program derived address(PDA)，只有地址没有私钥。\r\n\r\n数据的存储可以通过 programId + seed 来推导出特定的 pda 地址。\r\n\r\n因此可以实现一个合约管理某个数据。\r\n\r\n如果数据特别大呢？比如保存100个人的点赞，可以用一个数据账户存，也可以把每个人的数据单独分开存一个数据账户。\r\n\r\n怎么单独分开呢？programId + 用户的 publicKey，这样保证每个人的数据都是独立的。这里的种子对应的就是用户的地址。\r\n\r\n同理，如果不仅要存点赞，还要存评论数据呢？\r\n\r\n还是从种子入手，种子可以是 programId + 用户的 publicKey + 文章标题，这样就可以明确的找到所需的数据。\r\n\r\n虽然合约是相同的那一个程序，但是种子+用户地址，可以隔离出单独的数据账户，相当于每个人自己拥有一份数据库，这可能也是 web3 去中心化并且用户拥有自己的数据权利的原因。","title":"在登链社区挑战100天学习web3——第2天，solana 入门钱包连接+账户模型的理解"},"history":null,"timestamp":1723815947,"version":1}