Truffle Problems

Shanshan yuan · 收录于 2023-12-06 19:58:42 · source URL

1. web3.eth.accounts undefined

在truffle里面用

accounts = await web3.eth.getAccounts()

就可以得到账户数组,在前面加await是因为getaccounts 是异步函数

在控制台函数转账,函数参数为

({from:accounts[0],value:web3.utils.toWei(‘2’,‘ether’)})

具体可以看web3.utils库的用法

2.使用以太坊钱包小狐狸踩过的坑

当web3.js和以太坊交互的时候,console中出现下面的情况:

MetaMask - RPC Error: Error: [ethjs-rpc] rpc error with payload {"id":604491

重置一下账号。

3.Returned values aren’t valid, did it run Out of Gas?在webpack中

解决方法:删除build 文件后,重新运行truffle develop --> truffle compile --> truffle migrate

4. js解析智能合约Solidity返回的struct

https://blog.csdn.net/qq_33829547/article/details/81385653

5.这个问题的应该属于solidity编程

Array类型的声明:
string[] address;
对其赋值:
address[0]= “helloworld”;
//上面的赋值是错误的,因为。对于string[] 的赋值不可以依赖他的自增性,或者直接给他一个index(指数)
address.length++;
address[0]= “helloworld”;
//上述的这个声明是正确的,同样的,你必须每次向里面添加值的时候都需要通过length的特性。

6.remix连接本地文件

写智能合约,remix是一个很好的IDE。但是由于存在于网页上,丢失风险很大。这里实现remix与本地文件相关联(访问本地文件夹)。这里博主是在windos平台下操作。其他详见remix官方文档

安装remixd
npm install -g remixd
remixd是npm的一个模块。它可以使web版的remix连接到本地文件夹。
首先就要安装npm,这个的安装详见:【安装nodejs】(先挖个坑)。

实现连接

remixd -s <absolute-path-to-the-shared-folder> --remix-ide <your-remix-ide-URL-instance>

例如本人使用地址文件夹为

remixd  -s D:\Solidity_workspace\ChatOnBlackchain\contracts  --remix-ide https://remix.ethereum.org

ex:remixd -s E:\BUPT\Postgraduate\BC\remix\remix_local --remix-ide http://remix.ethereum.org
在写remix地址的时候,弄清楚http还是https,否则会没有任何反应;(两者都可以,只是登录网页版的时候确定自己的共享网址也就是【https://remix.ethereum.org/或者http://remix.ethereum.org】)
执行这个命令的用户对the-shared-folder有足够的权限(读/写);
后面加上–read-only,便是只读模式。
对于能够接入TCP端口65520的人,the-shared-folder亦是完全开放的。

7. solidity 编程需要注意:

有时候如果通过一个方法返回一个string无法获得,可以将这个方法拆成两个方法,一个赋值,一个获得结果,对于这个结果的声明应该放到程序首部声明。

contract CreateUsers{

    string public aimString;
    
//get note (get a string by this function)
    function getNote (address _address) public {
        _address = msg.sender;
        uint number = notes[_address].length;
        for(uint i = 0; i< number; i++){
            aimString = strConcat(aimString, notes[msg.sender][i]);
        }
    }
    
    //get notes
    function returnotes() public view returns(string memory){
        return aimString;
    }
}
8.废了一天,解决webpack打包多个js 的问题

https://blog.csdn.net/weixin_36185028/article/details/81117730

webpack中采用打包才可以引入js,如何打包:
在这里插入图片描述
enter是你的源文件的位置,path,是输入文件的位置。当前“dist”默认是和src文件同级。其中你的main1,main2…也就是你【name】,最后生成的文件分别是:main1.js main2.js ,main3.js。如果想要使用。直接在html中输入:

就可以使用了。

【注意:对于使用particles.min.js+app.js实现星型动态图的效果,必须将这两个js放在html的最下面(后面)】

图片img标签 src="[object Module]" --学习笔记

在js中添加一个图片标签,显示图片地址找不到,或者显示【object Module】,可以使用下面的配置解决:
在这里插入图片描述

https://blog.csdn.net/simper_boy/article/details/103455444

在webpack +truffle +js 如何通过合于对象调用event???

这个问题耗费了一天的时间终于解决!!
step1:需要注意的是:var provider = new Web3.providers.WebsocketProvider(“ws://127.0.0.1:8545”);
Http,已经不支持对event 的操作
step2:对于通过web3.js使用这种操作:

mycontract.events.myevent({});//还是不能调用的,会显示没有这个event,并不是没有这个事件,而是这种调用是错误。
//试试这种:
mycontract.myevent({})// 

【另外值得注意的是:及时你已经解决了第一二步,还是不能通过watch(function(err,result))来监控你的event事件,因为。。。。。。。。。就没有这种方法。这可能是API接口或是版本已经改了:建议用这种方法:】

 noteStore.deployed().then(function(i) {
        NotesEvent = i.NewNote({some:'args'},function (err,result) {
                if (err) {
                    console.log("adafafaf哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈",err)
                    return;
                }
                console.log("result.args:" ,result.args)
                saveNote(result.args);
        });
    })
本笔记是一个开发笔记,所以涉及到的是开发中产生的问题。js+mongodb

在js连接Mongo中使用的是使用面向module的语言,另外如果你需要添加某条记录的时间,那尚可不要通过数据的出入,因为数据库本身就有这种语句:

var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
var Schema = mongoose.Schema;

var UsersNotes = new Schema({
    address:String,
    note:String,
    reg_time:{type:Date,default:Date.now()}//加入时间
},{
    versionKey:false,//不显示版本号,不在mongo 中显示"_v"
})

var NotesModel = mongoose.model('Notes', UsersNotes);
module.exports = NotesModel;
在truffle 中进行合约交互
var myContract
CreateUsers.deployed().then((instance)=>{myContract = instance})

//CreateUsers 是合约对象
js中使用web3调用函数会出现“getAccouts() is not a function"

这是因为在js中使用是不支持异步操作,所以必须出入一个参数function(err, result)

   web3.eth.getAccounts(function (err, result) {
        console.log('web3.getaccount:',result)

相信其他的操作一定也会遇到这样的问题,那么,对于账号的存储就可以不借助cookie

函数返回的是一个对象 object?
 function getName() public view returns(string memory){
        return name;
    }

解决方法,使用的时候加上一个call()
let st = await getName().call();