2022-09-07 19:37:03 +00:00
|
|
|
package notary_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"math/big"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/gas"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/notary"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/policy"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/vm/vmstate"
|
|
|
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
|
|
|
)
|
|
|
|
|
|
|
|
func ExampleActor() {
|
|
|
|
// No error checking done at all, intentionally.
|
|
|
|
w, _ := wallet.NewWalletFromFile("somewhere")
|
|
|
|
defer w.Close()
|
|
|
|
// We assume there are two accounts in the wallet --- one is a simple signature
|
|
|
|
// account and another one is committee account. The first one will send notary
|
|
|
|
// requests, while committee signatures need to be collected.
|
|
|
|
|
|
|
|
// Create an RPC client.
|
|
|
|
c, _ := rpcclient.New(context.Background(), "url", rpcclient.Options{})
|
|
|
|
|
|
|
|
// An actor for the first account.
|
|
|
|
single, _ := actor.NewSimple(c, w.Accounts[0])
|
|
|
|
|
|
|
|
// Transfer some GAS to the Notary contract to be able to send notary requests
|
|
|
|
// from the first account.
|
|
|
|
gasSingle := gas.New(single)
|
2023-05-15 15:04:32 +00:00
|
|
|
txid, vub, _ := gasSingle.Transfer(single.Sender(), notary.Hash, big.NewInt(10_0000_0000), ¬ary.OnNEP17PaymentData{Till: 10000000})
|
2022-09-07 19:37:03 +00:00
|
|
|
|
|
|
|
var depositOK bool
|
|
|
|
// Wait for transaction to be persisted, either it gets in and we get
|
|
|
|
// an application log with some result or it expires.
|
|
|
|
for height, err := c.GetBlockCount(); err == nil && height <= vub; height, err = c.GetBlockCount() {
|
|
|
|
appLog, err := c.GetApplicationLog(txid, nil)
|
|
|
|
// We can't separate "application log missing" from other errors at the moment, see #2248.
|
|
|
|
if err != nil {
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if len(appLog.Executions) == 1 && appLog.Executions[0].VMState == vmstate.Halt {
|
|
|
|
depositOK = true
|
|
|
|
} else {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !depositOK {
|
|
|
|
panic("deposit failed")
|
|
|
|
}
|
|
|
|
|
|
|
|
var opts notary.ActorOptions
|
|
|
|
// Add high priority attribute, we gonna be making committee-signed transactions anyway.
|
|
|
|
opts.MainAttributes = []transaction.Attribute{{Type: transaction.HighPriority}}
|
|
|
|
|
|
|
|
// Create an Actor with the simple account used for paying fees and committee
|
|
|
|
// signature to be collected.
|
|
|
|
multi, _ := notary.NewTunedActor(c, []actor.SignerAccount{{
|
|
|
|
// Sender, regular account with None scope.
|
|
|
|
Signer: transaction.Signer{
|
|
|
|
Account: w.Accounts[0].ScriptHash(),
|
|
|
|
Scopes: transaction.None,
|
|
|
|
},
|
|
|
|
Account: w.Accounts[0],
|
|
|
|
}, {
|
|
|
|
// Commmitee.
|
|
|
|
Signer: transaction.Signer{
|
|
|
|
Account: w.Accounts[1].ScriptHash(),
|
|
|
|
Scopes: transaction.CalledByEntry,
|
|
|
|
},
|
|
|
|
Account: w.Accounts[1],
|
|
|
|
}}, opts)
|
|
|
|
|
|
|
|
// Use the Policy contract to perform something requiring committee signature.
|
|
|
|
policyContract := policy.New(multi)
|
|
|
|
|
|
|
|
// Wrap a transaction to set storage price into a notary request. Fallback will
|
|
|
|
// be create automatically and all appropriate attributes will be added to both
|
|
|
|
// transactions.
|
|
|
|
mainTx, fbTx, vub, _ := multi.Notarize(policyContract.SetStoragePriceTransaction(10))
|
|
|
|
_ = mainTx
|
|
|
|
_ = fbTx
|
|
|
|
_ = vub
|
|
|
|
}
|