简介
一切皆
==Account==
合约是Account, 数据是Account, 账户Account
Account之间互相操作,就是一个系统。
在实际的操作过程,其实我们只需要读跟写。所以会分开这两大类型讲
读
ETH的实现
我们可以先看eth是怎么做的。
eth的话,就很简单实现,比如下面有如下合约代码。
Contrct Test{
string name;
function setName(string _name) public {
name = _name;
}
function getName() public returns(string) {
return name;
}
}
js获取的话
contrct.getName().call()
如果对eth js不熟悉,看这里web3小白实战指导
Solana的区别
在上面中,我们是可以从合约里面读取的,也就是读和写,没多大区别。但是在Solana上面比这个纯粹,数据是在account上的,一切都是account,所以我们直接读account的信息就好了。
既然是account,我们读取就行了,但是读取之前,我们需要先得到这个account的地址。下面就说怎么得到account的address。
我们可以使用PDA来计算address
PDA
get pad address
const pubkey = await findProgramAddress([
TOKEN_PROGRAM_ID.toBuffer(), // pubkey
Buffer.from('string'), // string to buffer
])[0]
获取数据
既然拿到地址,我们就可以根据地址获取数据了。获取数据的方式如下。
这个是rpc方法,其实用solana-web3库是封装好的。
拿到之后解析即可。怎么解析我看上一个文章 获取各种account数据的方式
schema怎么写,看这个条件查询
部分不知道怎么操作的,可以看metaplex代码(nft开源项目)
读完了,就是写
操作(写)
一个合约的一次操作,是一个指令。
一次发起可以有多个指令,多个指令组合成一个交易。
总指令大小不能超过1232字节
指令里面有data跟accounts。
data编码和解码方式基本一样。
accounts也叫keys.
instructions.push(
new TransactionInstruction({
keys,
programId: toPublicKey(stringPubkey),
data,
})
)
交易需要对需要签名的进行传入keypair(pubkey, priviKey)
怎么构建交易,如下
const instructions: TransactionInstruction[] = [];
const transaction = new Transaction();
instructions.forEach(instruction => {
transaction.add(instruction);
});
transaction.recentBlockhash = (
await connection.getRecentBlockhash('max')
).blockhash;
transaction.feePayer = payerPublicKey;
const signedTransaction = await wallet.signTransaction(transaction);
const tx = await connection.sendRawTransaction(
signedTransaction.serialize(),
);
完整案例,看我上一篇 sol转账
后言
其他的都是业务了,以及标准了,比如token标准,nft标准。以及ar上传等。但是都是基于上面的基础衍生的。
祝大家开发顺利。
--完--