使用web3js和galanche调用带值的以太坊智能合约
Calling ethereum smart contracts with value using web3js and galanche
我对以太坊智能合约还很陌生,所以这可能是个愚蠢的问题,但我需要有人帮助我。我已经在我的机器(MacOS 11)上设置了 Galanche,并使用 truffle 编写了一个非常简单的货币智能合约(我不打算将其用作实际货币,我只是想了解智能合约)。
我编译了合约并成功部署到我的 Galanche 区块链。
现在,我想使用 web3.js 与其进行交互。我已经建立了一个nodejs项目并安装了web3。作为第一个测试,我 运行 以下脚本:
const Web3 = require("web3");
const fs = require("fs");
const web3 = new Web3("http://192.168.178.49:7545");
const abi = JSON.parse(
fs.readFileSync("path/to/compiled/MyCoin.json").toString()
).abi;
const MyCoin = new web3.eth.Contract(
abi,
// My contract's address
"0x3265aA0A2c3ac15D0eDd67BC0fa62A446c112F98"
);
(async () => {
console.log("Starting!");
var coinCount = await MyCoin.methods
.getTotalCoins()
.call({ from: "0x2d0616BF48214513f70236D59000F1b4f395a2Fd" });
console.log("Current registered MyCoin tokens:", coinCount);
})();
地址0x2d0616BF48214513f70236D59000F1b4f395a2Fd
是Galanche给我显示的第一个地址
它按预期工作并且 returns 默认硬币数量。
现在,我想要 运行 一个名为 buyMyCoin
的方法,它需要付款。我试过 运行ning:
...
MyCoin
.methods
.buyMyCoin
.send(
{
from: '0x2d0616BF48214513f70236D59000F1b4f395a2Fd',
value: some_amount_of_wei
}
);
...
我希望当我再次 运行 这个 node.js 脚本时,第一部分会告诉我总共有 <n>
个硬币,但事实并非如此。它只是 returns 与上次相同的值。
我做错了什么 web3.js 还是我的合同有问题?
顺便说一句:我没有看到任何资金离开 Galanche 的地址 0x2d0616BF48214513f70236D59000F1b4f395a2Fd
,所以我很确定这不是我的合同...
我希望在某个地方我必须使用它的 public 密钥登录到这个地址,但我在 web3.js 文档中找不到任何关于它的不是很模糊的东西...
编辑:这是我的 buyMyCoin 方法的代码:
...
/**
* @dev Buy MyCoin
*/
function buyMyCoin() external payable {
require(msg.value > 1 gwei, "Minimum transaction is 1 gwei"); // Not very much
uint256 amount = convert(msg.value, conversionRate, true);
balances[msg.sender].owner = payable(msg.sender);
balances[msg.sender].amount += amount;
totalCoins += amount;
}
...
原来是我傻了!我试图 运行 使用极低的以太币 (4 gwei) 进行交易,当然,以太币太小以至于在 Ganache 应用程序中看不到它。
我没有看到新硬币被创建的原因是因为我的转换代码将结果四舍五入为 0。
我对以太坊智能合约还很陌生,所以这可能是个愚蠢的问题,但我需要有人帮助我。我已经在我的机器(MacOS 11)上设置了 Galanche,并使用 truffle 编写了一个非常简单的货币智能合约(我不打算将其用作实际货币,我只是想了解智能合约)。
我编译了合约并成功部署到我的 Galanche 区块链。
现在,我想使用 web3.js 与其进行交互。我已经建立了一个nodejs项目并安装了web3。作为第一个测试,我 运行 以下脚本:
const Web3 = require("web3");
const fs = require("fs");
const web3 = new Web3("http://192.168.178.49:7545");
const abi = JSON.parse(
fs.readFileSync("path/to/compiled/MyCoin.json").toString()
).abi;
const MyCoin = new web3.eth.Contract(
abi,
// My contract's address
"0x3265aA0A2c3ac15D0eDd67BC0fa62A446c112F98"
);
(async () => {
console.log("Starting!");
var coinCount = await MyCoin.methods
.getTotalCoins()
.call({ from: "0x2d0616BF48214513f70236D59000F1b4f395a2Fd" });
console.log("Current registered MyCoin tokens:", coinCount);
})();
地址0x2d0616BF48214513f70236D59000F1b4f395a2Fd
是Galanche给我显示的第一个地址
它按预期工作并且 returns 默认硬币数量。
现在,我想要 运行 一个名为 buyMyCoin
的方法,它需要付款。我试过 运行ning:
...
MyCoin
.methods
.buyMyCoin
.send(
{
from: '0x2d0616BF48214513f70236D59000F1b4f395a2Fd',
value: some_amount_of_wei
}
);
...
我希望当我再次 运行 这个 node.js 脚本时,第一部分会告诉我总共有 <n>
个硬币,但事实并非如此。它只是 returns 与上次相同的值。
我做错了什么 web3.js 还是我的合同有问题?
顺便说一句:我没有看到任何资金离开 Galanche 的地址 0x2d0616BF48214513f70236D59000F1b4f395a2Fd
,所以我很确定这不是我的合同...
我希望在某个地方我必须使用它的 public 密钥登录到这个地址,但我在 web3.js 文档中找不到任何关于它的不是很模糊的东西...
编辑:这是我的 buyMyCoin 方法的代码:
...
/**
* @dev Buy MyCoin
*/
function buyMyCoin() external payable {
require(msg.value > 1 gwei, "Minimum transaction is 1 gwei"); // Not very much
uint256 amount = convert(msg.value, conversionRate, true);
balances[msg.sender].owner = payable(msg.sender);
balances[msg.sender].amount += amount;
totalCoins += amount;
}
...
原来是我傻了!我试图 运行 使用极低的以太币 (4 gwei) 进行交易,当然,以太币太小以至于在 Ganache 应用程序中看不到它。
我没有看到新硬币被创建的原因是因为我的转换代码将结果四舍五入为 0。