solana 编写智能合约 然后调用它

我们采用 Rust 开发智能合约,并通过 Web3 和 Go 实现合约调用。通过Solana Playground | Solana IDE 编写智能合约

1.使用 rust 编写一个

这个智能合约 内容就是输出一行文字

复制代码
// 导入 solana_program
// account_info 账户详细信息
// entrypoint 程序入口
// msg 在 Solana 上打印信息
use solana_program::{
    account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};

//定义代码入口 开始执行是能合约
entrypoint!(process_instruction);

// 定义一个名为 process_instruction 的公共函数。参数为程序 id、帐户和指令数据字段
pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    // 将"Hello World "消息打印在 Solana 区块链上
    msg!("Hello, Solana! add  wen3");

    // 向系统返回状态代码来退出程序,
    Ok(())
}

2.内置 的 web3 来调用

这个就是 web3 调用 智能 合约的, pg.PROGRAM_ID 就是这个编辑器内置的一个 变量。也就是我们发布的 智能合约地址

TypeScript 复制代码
// Client
console.log("My address:", pg.wallet.publicKey.toString());
const balance = await pg.connection.getBalance(pg.wallet.publicKey);
console.log(`My balance: ${balance / web3.LAMPORTS_PER_SOL} SOL`);

// 使用 web3.Transaction() 创建一个新的 Tx
const transcation = new web3.Transaction();

// 创建一个 Instruction
// Keys[]中列出了交易中涉及的所有帐户和它们各自的访问权限(例如,是否可以读取、写入等),因为代码不需要与用户帐户交互,所以这里Keys[]为空
transcation.add(
  new web3.TransactionInstruction({
    keys: [],
    programId: new web3.PublicKey(pg.PROGRAM_ID),
  })
);

console.log("Sending transaction ...");

// 调用 sendAndConfirmTransaction() 方法,参数为 端口、交易、签名的私钥数组
const txHash = await web3.sendAndConfirmTransaction(
  pg.connection,
  transcation,
  [pg.wallet.keypair]
);

//打印消息记录到控制台,并显示哈希值
console.log("transaction send with hash", txHash);

调用成功 这个就有输出:

3. 使用 go for solana-go-sdk 调用

这是SDK 地址, 里面分装了很多功能,使用起来比 官方的方便。

Go 复制代码
func Info(con *gin.Context) {
	c := client.NewClient(appSolana.RpcClientType())

    //最近的一个区块地址
	res, err := c.GetLatestBlockhash(context.Background())
	if err != nil {
		logger.Error().Msg(err.Error())
	}

    //拼接合约调用
	tx, err := types.NewTransaction(types.NewTransactionParam{
		Message: types.NewMessage(types.NewMessageParam{
			FeePayer:        appSolana.FeedWallet.PublicKey,
			RecentBlockhash: res.Blockhash,
			Instructions: []types.Instruction{
                //智能合约 地址 应为我们目前不需要参数 和 其他地址
				types.Instruction{
					ProgramID: common.PublicKeyFromString("2SKHaqHzYWwRKPJYbxyP4x2pe7wqwJe6qSdSttWsxDBQ"), //调用合约的地址
				},
			},
		}),
		Signers: []types.Account{appSolana.FeedWallet},
	})

	if err != nil {
		logger.Error().Msg(err.Error())
	}
	txHash, errHash := c.SendTransaction(context.Background(), tx)
	if errHash != nil {
		logger.Error().Msg(errHash.Error())
	}
	logger.Info().Msg(txHash)
}
相关推荐
木西18 小时前
深度拆解 Grass 模式:基于 EIP-712 与 DePIN 架构的奖励分发系统实现
web3·智能合约·solidity
devmoon5 天前
区块链预言机(Oracle)解析:Polkadot、以太坊与 Solana 如何把现实世界带入链上?
开发语言·oracle·区块链·信息与通信·以太坊·polkadot·solana
木西5 天前
深度解析|Form Network:BNX 迁移模块化 L2 的全流程技术实践
web3·智能合约·solidity
devmoon5 天前
区块链 Indexer 全解析:为什么 Web3 应用离不开数据索引器?(Polkadot / Ethereum / Solana 对比与未来展望)
rust·web3·区块链·以太坊·polkadot·solana·indexer
木西7 天前
STEPN相关内容延续篇:基于OpenZeppelinV5与Solidity0.8.24的创新点拆解
web3·智能合约·solidity
木西8 天前
深度实战:用 Solidity 0.8.24 + OpenZeppelin V5 还原 STEPN 核心机制
web3·智能合约·solidity
这儿有一堆花9 天前
OpenAI 和 Paradigm 推出 EVMbench:AI 帮智能合约把关的新工具
人工智能·智能合约
木西11 天前
实战|DeLinkedIn 全栈开发:Web3 身份验证 + 数字资产确权,搭建职场社交新生态
web3·智能合约·solidity
Rockbean15 天前
10分钟智能合约:进阶实战-3.3 拒绝服务攻击
web3·智能合约·solidity
EHagSJVNpTY16 天前
直流电机转速、电流双闭环无静差直流调速系统Matlab/Simulink仿真模型及其详细设计说明
智能合约